xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下

(每次学习一点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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值