http://doc.okbase.net/catcher1994/archive/220195.html
Catcher8 2016/4/23 0:28:50 阅读(72) 评论(0)
一、前言
回忆到上篇 《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