Xamarin.Android之封装个简单的网络请求类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.Android之封装个简单的网络请求类相关的知识,希望对你有一定的参考价值。

http://doc.okbase.net/catcher1994/archive/220195.html

Catcher8

一、前言

回忆到上篇 《Xamarin.Android再体验之简单的登录Demo》 做登录时,用的是GET的请求,还用的是同步,

于是现在将其简单的改写,做了个简单的封装,包含基于HttpClient和HttpWebRequest两种方式的封装。

由于对这一块还不是很熟悉,所以可能不是很严谨。

二、先上封装好的代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Json;
  5 using System.Linq;
  6 using System.Net;
  7 using System.Net.Http;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 
 11 namespace Catcher.androidDemo.Common
 12 {
 13     public static class EasyWebRequest
 14     {
 15         /// <summary>
 16         /// send the post request based on HttpClient
 17         /// </summary>
 18         /// <param name="requestUrl">the url you post</param>
 19         /// <param name="routeParameters">the parameters you post</param>
 20         /// <returns>return a response object</returns>
 21         public static async Task<object> SendPostRequestBasedOnHttpClient(string requestUrl, IDictionary<string, string> routeParameters)
 22         {
 23             object returnValue = new object();
 24             HttpClient client = new HttpClient();
 25             client.MaxResponseContentBufferSize = 256000;
 26             Uri uri = new Uri(requestUrl);
 27             var content = new FormUrlEncodedContent(routeParameters);
 28             try
 29             {
 30                 var response = await client.PostAsync(uri, content);
 31                 if (response.IsSuccessStatusCode)
 32                 {
 33                     var stringValue = await response.Content.ReadAsStringAsync();
 34                     returnValue = JsonObject.Parse(stringValue);
 35                 }
 36             }
 37             catch (Exception ex)
 38             {
 39                 throw ex;
 40             }
 41             return returnValue;
 42         }
 43 
 44         /// <summary>
 45         /// send the get request based on HttpClient
 46         /// </summary>
 47         /// <param name="requestUrl">the url you post</param>
 48         /// <param name="routeParameters">the parameters you post</param>
 49         /// <returns>return a response object</returns>
 50         public static async Task<object> SendGetRequestBasedOnHttpClient(string requestUrl, IDictionary<string, string> routeParameters)
 51         {
 52             object returnValue = new object();
 53             HttpClient client = new HttpClient();
 54             client.MaxResponseContentBufferSize = 256000;
 55             //format the url paramters
 56             string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
 57             Uri uri = new Uri(string.Format("{0}?{1}", requestUrl, paramters));
 58             try
 59             {
 60                 var response = await client.GetAsync(uri);
 61                 if (response.IsSuccessStatusCode)
 62                 {
 63                     var stringValue = await response.Content.ReadAsStringAsync();
 64                     returnValue = JsonObject.Parse(stringValue);
 65                 }
 66             }
 67             catch (Exception ex)
 68             {
 69                 throw ex;
 70             }
 71             return returnValue;
 72         }
 73 
 74 
 75         /// <summary>
 76         /// send the get request based on HttpWebRequest
 77         /// </summary>
 78         /// <param name="requestUrl">the url you post</param>
 79         /// <param name="routeParameters">the parameters you post</param>
 80         /// <returns>return a response object</returns>
 81         public static async Task<object> SendGetHttpRequestBaseOnHttpWebRequest(string requestUrl, IDictionary<string, string> routeParameters)
 82         {
 83             object returnValue = new object();
 84             string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
 85             Uri uri = new Uri(string.Format("{0}?{1}", requestUrl, paramters));
 86             var request = (HttpWebRequest)HttpWebRequest.Create(uri);
 87 
 88             using (var response = request.GetResponseAsync().Result as HttpWebResponse)
 89             {
 90                 if (response.StatusCode == HttpStatusCode.OK)
 91                 {
 92                     using (Stream stream = response.GetResponseStream())
 93                     {
 94                         using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
 95                         {
 96                             string stringValue = await reader.ReadToEndAsync();
 97                             returnValue = JsonObject.Parse(stringValue);
 98                         }
 99                     }
100                 }
101             }
102             return returnValue;
103         }
104 
105         /// <summary>
106         /// send the post request based on httpwebrequest
107         /// </summary>
108         /// <param name="url">the url you post</param>
109         /// <param name="routeParameters">the parameters you post</param>
110         /// <returns>return a response object</returns>
111         public static async Task<object> SendPostHttpRequestBaseOnHttpWebRequest(string url, IDictionary<string, string> routeParameters)
112         {
113             object returnValue = new object();
114 
115             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
116             request.Method = "POST";
117 
118             byte[] postBytes = null;
119             request.ContentType = "application/x-www-form-urlencoded";
120             string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
121             postBytes = Encoding.UTF8.GetBytes(paramters.ToString());
122 
123             using (Stream outstream = request.GetRequestStreamAsync().Result)
124             {
125                 outstream.Write(postBytes, 0, postBytes.Length);
126             }
127 
128             using (HttpWebResponse response = request.GetResponseAsync().Result as HttpWebResponse)
129             {
130                 if (response.StatusCode == HttpStatusCode.OK)
131                 {
132                     using (Stream stream = response.GetResponseStream())
133                     {
134                         using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
135                         {
136                             string stringValue = await reader.ReadToEndAsync();
137                             returnValue = JsonObject.Parse(stringValue);
138                         }
139                     }
140                 }
141             }
142             return returnValue;
143         }
144     }
145 }

 

需要说明一下的是,我把这个方法当做一个公共方法抽离到一个单独的类库中

技术分享图片

 

三、添加两个数据服务的方法

 1         [HttpPost]
 2         public ActionResult PostThing(string str)
 3         {
 4             var json = new
 5             {
 6                 Code ="00000",
 7                 Msg = "OK",
 8                 Val = str
 9             };
10             return Json(json);
11         }
12 
13         public ActionResult GetThing(string str)
14         {
15             var json = new
16             {
17                 Code = "00000",
18                 Msg = "OK",
19                 Val = str
20             };
21             return Json(json,JsonRequestBehavior.AllowGet);
22         }

 

这两个方法,一个是为了演示post,一个是为了演示get

部署在本地的IIS上便于测试!

四、添加一个Android项目,测试我们的方法

先来看看页面,一个输入框,四个按钮,这四个按钮分别对应一种请求。

技术分享图片

 

然后是具体的Activity代码

 1 using System;
 2 using Android.App;
 3 using Android.Content;
 4 using Android.Runtime;
 5 using Android.Views;
 6 using Android.Widget;
 7 using Android.OS;
 8 using System.Collections.Generic;
 9 using Catcher.AndroidDemo.Common;
10 using System.Json;
11 
12 namespace Catcher.AndroidDemo.EasyRequestDemo
13 {
14     [Activity(Label = "简单的网络请求Demo", MainLauncher = true, Icon = "@drawable/icon")]
15     public class MainActivity : Activity
16     {        
17         EditText txtInput;
18         Button btnPost;
19         Button btnGet;
20         Button btnPostHWR;
21         Button btnGetHWR;
22         TextView tv;
23 
24         protected override void OnCreate(Bundle bundle)
25         {
26             base.OnCreate(bundle);
27           
28             SetContentView(Resource.Layout.Main);
29 
30             txtInput = FindViewById<EditText>(Resource.Id.txt_input);
31             btnPost = FindViewById<Button>(Resource.Id.btn_post);
32             btnGet = FindViewById<Button>(Resource.Id.btn_get);
33             btnGetHWR = FindViewById<Button>(Resource.Id.btn_getHWR);
34             btnPostHWR = FindViewById<Button>(Resource.Id.btn_postHWR);
35             tv = FindViewById<TextView>(Resource.Id.tv_result);
36 
37             //based on httpclient
38             btnPost.Click += PostRequest;
39             btnGet.Click += GetRequest;
40             //based on httpwebrequest
41             btnPostHWR.Click += PostRequestByHWR;
42             btnGetHWR.Click += GetRequestByHWR;
43         }
44 
45         private async void GetRequestByHWR(object sender, EventArgs e)
46         {
47             string url = "http://192.168.1.102:8077/User/GetThing";
48             IDictionary<string, string> routeParames = new Dictionary<string, string>();
49             routeParames.Add("str", this.txtInput.Text);
50             var result = await EasyWebRequest.SendGetHttpRequestBaseOnHttpWebRequest(url, routeParames);
51             var data = (JsonObject)result;
52             this.tv.Text = "hey," + data["Val"] + ",  i am from httpwebrequest get";
53         }
54 
55         private async void PostRequestByHWR(object sender, EventArgs e)
56         {
57             string url = "http://192.168.1.102:8077/User/PostThing";
58             IDictionary<string, string> routeParames = new Dictionary<string, string>();
59             routeParames.Add("str", this.txtInput.Text);
60             var result = await EasyWebRequest.SendPostHttpRequestBaseOnHttpWebRequest(url, routeParames);
61             var data = (JsonObject)result;
62             this.tv.Text = "hey," + data["Val"] + ",  i am from httpwebrequest post";
63         }
64 
65         private async void PostRequest(object sender, EventArgs e)
66         {
67             string url = "http://192.168.1.102:8077/User/PostThing";
68             IDictionary<string, string> routeParames = new Dictionary<string, string>();
69             routeParames.Add("str", this.txtInput.Text);
70             var result = await EasyWebRequest.SendPostRequestBasedOnHttpClient(url, routeParames);
71             var data = (JsonObject)result;
72             this.tv.Text = "hey," + data["Val"] + ",  i am from httpclient post";
73         }
74 
75         private async void GetRequest(object sender, EventArgs e)
76         {
77             string url = "http://192.168.1.102:8077/User/GetThing";
78             IDictionary<string, string> routeParames = new Dictionary<string, string>();
79             routeParames.Add("str", this.txtInput.Text);
80             var result = await EasyWebRequest.SendGetRequestBasedOnHttpClient(url, routeParames);
81             var data = (JsonObject)result;
82             this.tv.Text = "hey," + data["Val"] + ",  i am from httpclient get";
83         }
84     }
85 }

 

OK,下面看看效果图

 

技术分享图片  技术分享图片  技术分享图片  技术分享图片

 

如果那位大哥知道有比较好用的开源网络框架推荐请告诉我!!

 

最后放上本次示例的代码:

https://github.com/hwqdt/Demos/tree/master/src/Catcher.AndroidDemo

 

以上是关于Xamarin.Android之封装个简单的网络请求类的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Android之引导页的简单制作

Xamarin.Android和UWP之MVVM的简单使用

Xamarin.Forms - Android 全球不支持 PushAsync,请使用 NavigationPage

Xamarin.Android 入门之:Xamarin+vs2015 环境搭建

Xamarin.Android 入门之:Xamarin+vs2015 环境搭建

将网络从 wifi 切换到 3g 时 Android/Xamarin.Android 休息客户端超时