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

 

转载于:https://www.cnblogs.com/LuoEast/p/8017453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值