在Windows Phone系統中,通過HttpWebRequest類可以很容易的發送網路請求,擷取網路資料。HttpWebRequest是非同步作業,不會堵塞主線程。
1.通過HttpWebRequest.CreateHttp()方法可以建立一個HttpWebRequest,下面代碼簡單實現發送一個GET請求。
httpGet
public void httpGet() { try { //請求地址 String url = "http://www.cnblogs.com/huizhang212/"; //建立WebRequest類 HttpWebRequest request = HttpWebRequest.CreateHttp(new Uri(url)); //佈建要求方式GET POST request.Method = "GET"; //返回應答請求非同步作業的狀態 request.BeginGetResponse(responseCallback, request); } catch (WebException e) { //網路相關異常處理 } catch (Exception e) { //異常處理 } }
2.應答資料接收部分。
responseCallback
private void responseCallback(IAsyncResult result) { try { //擷取非同步作業返回的的資訊 HttpWebRequest request = (HttpWebRequest)result.AsyncState; //結束對 Internet 資源的非同步請求 HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); //解析應答頭 //parseRecvHeader(response.Headers); //擷取請求體資訊長度 long contentLength = response.ContentLength; //擷取應答碼 int statusCode = (int)response.StatusCode; string statusText = response.StatusDescription; //應答頭資訊驗證 using (Stream stream = response.GetResponseStream()) { //擷取請求資訊 StreamReader read = new StreamReader(stream); string msg = read.ReadToEnd(); Deployment.Current.Dispatcher.BeginInvoke(() => { textBlock1.Text = msg; }); } } catch (WebException e) { //串連失敗 } catch (Exception e) { //異常處理 } }
通過HttpWebResponse可以擷取返回的資料,在擷取資料後,要想將資料顯示到介面中,這裡要主要一個問題。由於HttpWebRequest是非同步作業,所以這裡應該有一個線程來處理網路,大家都知道Windows Phone中線上程裡是不能操作UI的,這個需要交個UI主線程來處理,所以代碼中用到了Deployment.Current.Dispatcher.BeginInvoke。
3.上面是簡單的GET請求,POST請求和GET請求相比,多了一個發送請求體的操作過程。以下代碼為POST請求,應對部分操作函數仍然是responseCallback。
httpPost
public void httpPost() { try { //請求地址 String url = "http://www.cnblogs.com/huizhang212/"; //建立WebRequest類 HttpWebRequest request = HttpWebRequest.CreateHttp(new Uri(url)); //佈建要求方式GET POST request.Method = "POST"; //返回應答請求非同步作業的狀態 request.BeginGetRequestStream(requestCallback, request); } catch (WebException e) { //網路相關異常處理 } catch (Exception e) { //異常處理 } } private void requestCallback(IAsyncResult result) { try { //擷取非同步作業返回的的資訊 HttpWebRequest request = (HttpWebRequest)result.AsyncState; //結束對 Internet 資源的非同步請求 StreamWriter postStream = new StreamWriter(request.EndGetRequestStream(result)); postStream.WriteLine("作者:宇之樂"); postStream.WriteLine("出處:http://www.cnblogs.com/huizhang212/"); //返回應答請求非同步作業的狀態 request.BeginGetResponse(responseCallback, request); } catch (WebException e) { //異常處理 } catch (Exception e) { //異常處理 } }