2014-10-26 20 views
2

我嘗試通過HTTP請求獲取和發送數據。 例如: HTTP GET(帶標題),檢索標題和正文 HTTP POST(帶標題和正文),檢索標題和正文 我需要操縱標題和正文,使用MvvmCross(用於Xamarin的Mvvm實現)Xamarin MvvmCross Http請求:這是如何工作的?

對於第一個版本,我已經開發:

public static class Http 
{ 

    public static async Task<HttpResponseMessage> Get (string url) 
    { 
     using(var httpClient = new HttpClient()) { 
      HttpRequestMessage request = new HttpRequestMessage (HttpMethod.Get, SharedResources.Api.ServerAddress + url); 
      request.Headers.Add ("Content-Type", "application/json"); 
      var response = await httpClient.SendAsync (request); 
      return response; 
     } 
    } 

    public static async Task<HttpResponseMessage> Post (string url, string body = "", string contentType = "application/json") 
    { 
     using (var httpClient = new HttpClient()) { 
      httpClient.DefaultRequestHeaders.Accept.Add (new MediaTypeWithQualityHeaderValue (contentType)); 
      var response = await httpClient.PostAsync (SharedResources.Api.ServerAddress + url, new StringContent(body)); 
      return response; 
     } 
    } 
} 

對於第二個版本,我已經開發,但我不知道怎麼去responseString

public static async Task<IAsyncResult> Post (string url, Dictionary<string,string> customHeaders, string body = "", string contentType = "application/json") 
    { 
     String finalresult = String.Empty; 
     HttpWebRequest httpPostWebRequest = (HttpWebRequest)WebRequest.Create (SharedResources.Api.ServerAddress + url); 
     foreach (var header in customHeaders) { 
      httpPostWebRequest.Headers [header.Key] = header.Value; 
     } 
     Task.Factory.StartNew (() => { 

      httpPostWebRequest.ContentType = contentType; 
      httpPostWebRequest.Method = "POST"; 
      return httpPostWebRequest.BeginGetRequestStream ((requestStreamAsyncResult) => { 
       HttpWebRequest httpWebRequestStream = (HttpWebRequest)requestStreamAsyncResult.AsyncState; 
       Stream postStream = httpWebRequestStream.EndGetRequestStream (requestStreamAsyncResult); 
       byte[] byteArray = Encoding.UTF8.GetBytes (body); 
       postStream.Write (byteArray, 0, body.Length); 
       httpWebRequestStream.BeginGetResponse ((responseAsyncResult) => { 
        HttpWebRequest request = (HttpWebRequest)responseAsyncResult.AsyncState; 
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse (responseAsyncResult); 
        Stream streamResponse = response.GetResponseStream(); 
        StreamReader streamRead = new StreamReader (streamResponse); 
        string responseString = streamRead.ReadToEnd(); 
        //**need to return responseString content** 
       }, httpWebRequestStream); 
      }, httpPostWebRequest); 

     }); 
    } 

現在,我發現這個博客條目:http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx

和編寫代碼:

public async static Task<String> Post (string url, Dictionary<string, string> headers = null, string body = "", string contentType = "application/json") 
    { 

     HttpClientHandler handler = new HttpClientHandler(); 
     var httpClient = new HttpClient (handler); 
     HttpRequestMessage request = new HttpRequestMessage (HttpMethod.Post, SharedResources.Api.ServerAddress + url); 

     if (headers != null) { 
      foreach (var header in headers) { 
       request.Headers.Add (header.Key, header.Value); 
       Mvx.Trace ("Adding {0} header to request, value {1} OK", header.Key, header.Value); 

       httpClient.DefaultRequestHeaders.Add (header.Key, header.Value); 
       Mvx.Trace ("Adding {0} header to httpClient, value {1} OK", header.Key, header.Value); 
      } 
     } 

     request.Content = new StringContent (body, Encoding.UTF8, contentType); 
     Mvx.Trace ("Adding content {0}", await request.Content.ReadAsStringAsync()); 

     if (handler.SupportsTransferEncodingChunked()) { 
      //REQUEST 
      request.Headers.TransferEncodingChunked = true; 

      // HTTPCLIENT 
      httpClient.DefaultRequestHeaders.TransferEncodingChunked = true; 
     } 

     Mvx.Trace ("READING request.Headers CONTENT"); 
     foreach (var header in request.Headers) { 
      foreach (var value in header.Value) { 
       Mvx.Trace ("{0} : {1}", header.Key, value); 
      } 
     } 

     Mvx.Trace ("READING httpClient.DefaultRequestHeaders CONTENT"); 
     foreach (var header in httpClient.DefaultRequestHeaders) { 
      foreach (var value in header.Value) { 
       Mvx.Trace ("{0} : {1}", header.Key, value); 
      } 
     } 

     HttpResponseMessage response = await httpClient.SendAsync (request); 
     Mvx.Trace ("SendAsync response : {0}", response.ToString()); 

     return await response.Content.ReadAsStringAsync(); 
    } 
+0

身體在'response.Content' – Stuart 2014-10-26 16:27:32

+0

你想要在什麼時候讀取請求的主體?你是否需要* request *或* response的主體?在示例代碼中不清楚 – madd0 2014-10-27 09:35:00

+0

Thanks @Stuat; 我將編輯我的問題,闡明我的真實目的 – 2014-10-27 11:34:20

回答

2

我已經找到了解決方案! :D

public async static Task<String> Post (string url, Dictionary<string, string> headers = null, string body = "", string contentType = "application/json") 
    { 
     HttpClientHandler handler = new HttpClientHandler(); 
     var httpClient = new HttpClient (handler); 
     HttpRequestMessage request = new HttpRequestMessage (HttpMethod.Post, SharedResources.Api.ServerAddress + url); 

     // add headers 
     if (headers != null) { 
      foreach (var header in headers) { 
       request.Headers.Add (header.Key, header.Value); 
       httpClient.DefaultRequestHeaders.Add (header.Key, header.Value); 
      } 
     } 
     // set the content 
     request.Content = new StringContent (body, Encoding.UTF8, contentType); 
     // set the content length 
     request.Content.Headers.ContentLength = body.Length; 

     // set transfer-enconding 
     if (handler.SupportsTransferEncodingChunked()) { 
      bool chuncked = false; 
      request.Headers.TransferEncodingChunked = chuncked; 
      httpClient.DefaultRequestHeaders.TransferEncodingChunked = chuncked; 
     } 
     // await and return response 
     HttpResponseMessage response = await httpClient.SendAsync (request); 
     return await response.Content.ReadAsStringAsync(); 
    }