xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下
来源:互联网 发布:基因毒性杂质数据库 编辑:程序博客网 时间:2024/05/16 15:42
(每次学习一点xamarin就做个学习笔记和视频来加深记忆巩固知识)
如有不正确的地方,请帮我指正。
简介
上次的学习笔记学习了如何进行GET请求,那么这次学习一下如何进行POST请求。
使用HttpURLConnection进行POST请求
直接上C#代码(记得在AndroidManifest.xml文件中声明网络权限<uses-permissionandroid:name="android.permission.INTERNET"/>)
/// <summary> /// 使用原生的HttpURLConnection类进行POST请求 /// </summary> /// <param name="address">请求地址</param> /// <param name="str">需要POST到服务器的数据</param> /// <param name="listener">监听对象</param> public static void PostHttpRequest(string address, string str, IHttpListener listener) { new Thread(new ThreadStart( () => { #region 子线程执行请求 HttpURLConnection conn = null; try { URL url = new URL(address); conn = (HttpURLConnection)url.OpenConnection(); //打开http连接 conn.RequestMethod = "POST"; //设置为post请求 conn.ConnectTimeout = 8000; //设置连接超时时间为8秒 conn.ReadTimeout = 8000; //设置读取数据超时时间为8秒 conn.DoInput = true; //允许接收数据,以后就可以使用conn.InputStream (Get请求时用) conn.DoOutput = true; //允许发送数据,以后就可以使用conn.OutputStream (POST时用, Get请求时加上这句会变Post) //conn.SetRequestProperty("Content-Type", "application/json;chartset=UTF-8"); Stream outStream = conn.OutputStream; //得到输出流对象 byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(str); //将要上传的数据转为字节 outStream.Write(byteData, 0, byteData.Length); //向当前流中写入字节 outStream.Flush(); //清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备 outStream.Close(); //关闭当前流并释放与之关联的所有资源 StringBuilder sb = new StringBuilder(); Stream inStream = conn.InputStream;//实际发送请求 using (StreamReader reader = new StreamReader(inStream, Encoding.UTF8)) { string line; while ((line = reader.ReadLine()) != null) { sb.Append(line); } } if (listener != null) listener.OnFinish(sb.ToString()); //回调OnFinish()方法 } catch (Exception e) { if (listener != null) listener.OnError(e); //回调OnError()方法 } finally { if (conn != null) conn.Disconnect(); //关闭连接 } #endregion } )).Start(); }
使用Square.OKHttp3进行POST请求
直接上C#代码//定义Http请求头的Content-Type, OKhttp3需要使用MediaType这个类 public static readonly MediaType MediaType_JSON = MediaType.Parse("application/json;chartset=UTF-8"); public static readonly MediaType MediaType_TEXT = MediaType.Parse("text/plain;chartset=UTF-8");public static void PostHttpRequestByOkHttp3(string address, string str, MediaType mediaType, Square.OkHttp3.ICallback callback) { OkHttpClient httpClient = new OkHttpClient.Builder() .ConnectTimeout(8, TimeUnit.Seconds) //设置连接超时时间为8秒 .WriteTimeout(8, TimeUnit.Seconds) //设置写数据的超时时间为8秒 .ReadTimeout(8, TimeUnit.Seconds) //设置读取数据的超时时间为8秒 .Build(); RequestBody requestBody = RequestBody.Create(mediaType, str); Request request = new Request.Builder() .Url(address) .Post(requestBody) .Build(); httpClient.NewCall(request).Enqueue(callback);//在Enqueue()方法内部自动开好子线程了 }
在Activity中分别使用,主要代码如下,另外访问本机的Web服务器端程序时需要注意:localhost会被认为是模拟器自己,而10.0.2.2是安卓越内置的特定IP,表示本机。所以模拟器上访问本机得用10.0.2.2
case Resource.Id.button2: //C.用原生HttpURLConnection 进行POST请求 User[] userArray = new User[] { new User{ UserId=3, UserName="xiaoming" }, new User{ UserId=4, UserName="xiaoyan"} }; string json = JsonConvert.SerializeObject(userArray); HttpHelper.PostHttpRequest("http://10.0.2.2:56010/api/values", json, this); //D.使用OkHttp3 进行POST请求 //HttpHelper.PostHttpRequestByOkHttp3("http://10.0.2.2:56010/api/values", json, HttpHelper.MediaType_TEXT, this); break;
顺便学习下在安卓中JSON的使用
在.net中处理JSON用得比较多的是开源库Newtonsoft.Json。在安卓中也可使用原生的JSONObject类来处理JSON。
它们的使用分别如下
//先得从Nuget中下载Newtonsoft.Json
private void ParseJsonByNewtonsoft(string json)//使用开源库Newtonsoft.Json来解析json数据 { var userList = JsonConvert.DeserializeObject<List<User>>(json); foreach (User user in userList) { Toast.MakeText(this, string.Format("userId={0} userName={1}", user.UserId, user.UserName), ToastLength.Short).Show(); } }private void ParseJson(string json)//使用安卓原生的JSONObject来解析json数据 { try { JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.Length(); i++) { JSONObject jsonObj = jsonArray.GetJSONObject(i); int userId = jsonObj.GetInt("UserId"); string userName = jsonObj.GetString("UserName"); Toast.MakeText(this, string.Format("userId={0} userName={1}", userId, userName), ToastLength.Long).Show(); } } catch (Exception) { throw; } }
完整代码和视频在我上传的CSDN资源中http://download.csdn.net/download/junshangshui/10049308
阅读全文
0 0
- xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下
- xamarin学习笔记A15(安卓OkHttp3和HttpURLConnection) 上
- xamarin学习笔记A14(安卓AsyncTask和RunOnUiThread)
- xamarin学习笔记A17(安卓Parcel和IParcelable)
- xamarin学习笔记A03(安卓Activiy)
- xamarin学习笔记A07(安卓Fragment)
- xamarin学习笔记A08(安卓广播)
- xamarin学习笔记A10(安卓SQLite)
- xamarin学习笔记A11(安卓ContentProvider)
- xamarin学习笔记A12(安卓Notification)
- xamarin学习笔记A18(安卓Service)
- xamarin学习笔记A19(安卓AIDL)
- xamarin学习笔记A02(安卓项目组成)
- xamarin学习笔记A04(安卓基本布局)
- xamarin学习笔记A05(安卓RecycleView简单显示)
- xamarin学习笔记A06(安卓RecycleView点击事件)
- xamarin学习笔记A09(安卓数据简单存储)
- xamarin学习笔记A13(安卓Handler异步消息处理)
- C语言中用循环打印各种图形
- Linux系统基础(十二)
- LeetCode题解系列--718. Maximum Length of Repeated Subarray
- 删数问题(山东理工2072)
- 事件循环与任务队列
- xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下
- java习题
- MySQL中给中文进行排序
- final修饰类和方法
- 滚动条
- 代理模式
- 表单
- Java消息中间件学习笔记五 -- ActiveMQ的使用【主题模式】
- 多传感器信息融合笔记