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
原创粉丝点击