OkHttp的基本使用(二)Post请求

来源:互联网 发布:淘宝上不错的美国代购 编辑:程序博客网 时间:2024/06/05 19:31
上篇【OkHttp的基本使用一】介绍了OkHttp的Get请求方式,也是OkHttp基本使用的开端,如果是第一次使用OkHttp的同学可以先从OkHttp的基本使用一开始阅读,此篇主要介绍OkHttp的Post请求方式。
在介绍OkHttp的Post请求的基本使用之前,我们需要了解什么是Post,以及什么是Get?对于android程序员来说,对这2个概念不像web工程师那样熟悉,在这里我们先简要说明Post和Get请求的区别:
  • Post或者Get只是Http协议中向后台服务器发送数据的一种机制,是Http协议的一个组成部分。
  • Post请求是将要提交到后台服务器的数据放在Http包的包体中。
  • Get请求是将数据放在URL之后,比如http://androidxx.cn/forum.php?mo ... d=11&extra=page%3D1,可以看到此URL由2部分组成,分别是http://androidxx.cn/forum.php和?后面的参数。这就是典型的Get请求方式。
  • 因为Get请求时直接将参数放在URL后面,而URL的长度是有一定的限制,所以当传递的数据特别大的时候,Get请求就不能完成。
  • 相比较,Post请求的参数是放在Http包的内部,不能轻易被看到;Get请求的参数直接是跟在URL之后,可以很容易被用户获取。所以,相对而言,Post的请求方式更安全。
在实际项目开发过程中,什么时候使用Get、什么时候使用Post呢?
Post(当涉及到参数的安全问题或者参数比较大的时候,应该使用Post请求方式),比如:
  • 登陆
  • 注册
  • 上传
  • 支付
  • 下单
  • ...
Get(Get就是获取的意思,项目开发中,如果是相对简单的查询类接口可以使用Get请求方式),比如:
  • 获取图片
  • 获取文章详情
  • ...
以上就是Get和Post的一个简单的介绍,对刚入门的android程序员应该会有点帮助。然后,接下来我们开始OkHttp的Post请求方式的学习。
  • Post的同步请求方式(在android的主线程中,需要将下面的代码放在new Thread的run方法中执行,否则报错(错误详见))
  1. OkHttpClient okHttpClient = new OkHttpClient();
  2.         //Form表单格式的参数传递
  3.         FormBody formBody = new FormBody
  4.                 .Builder()
  5.                 .add("goodsId","2799")//设置参数名称和参数值
  6.                 .build();
  7.         Request request = new Request
  8.                 .Builder()
  9. <font color="royalblue">                .post(formBody)//Post请求的参数传递,此处是和Get请求相比,多出的一句代码</font>
  10. .url(Config.POST_URL)
  11.                 .build();
  12.         try {
  13.             Response response = okHttpClient.newCall(request).execute();
  14.             String result = response.body().string();
  15.             Log.d("androixx.cn",result);
  16.             response.body().close();
  17.         } catch (IOException e) {
  18.             e.printStackTrace();
  19.         }
复制代码
以上是一个Post同步请求方式代码。Post请求的重点在参数的传递方式,也就是代码的第9行.post()方法。post()方法中的参数是要传递到后台服务器的参数,是一个RequestBody类型的参数。其他的代码同Get请求的基本一致。
在实际项目开发中,只要是使用Post请求方式的,都涉及参数传递。文章开头也说了,Post和Get请求的最大的不同点就在参数传递,所以接下来我们介绍一下Post的各种格式的参数传递。(注意:对于初学者,将视线重点放在Post和Get的参数传递方式上来学习OkHttp请求可能要更直观一些,也可能更容易理解)。
  • Form表单数据的传递(上面的代码中的FormBody就是表单参数的设置方式,表单数据的传递就不重复帖代码,代码同上)
  • Json格式数据的传递
  1. //设置媒体类型。application/json表示传递的是一个json格式的对象
  2.         MediaType mediaType = MediaType.parse("application/json");
  3.         //使用JSONObject封装参数
  4.         JSONObject jsonObject = new JSONObject();
  5.         try {
  6.             jsonObject.put("参数名","参数值");
  7.         } catch (JSONException e) {
  8.             e.printStackTrace();
  9.         }
  10.         //创建RequestBody对象,将参数按照指定的MediaType封装
  11.         RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString());
  12.         Request request = new Request
  13.                 .Builder()
  14.                 .post(requestBody)//Post请求的参数传递
  15.                 .url(Config.POST_URL)
  16.                 .build();
  17.         try {
  18.             Response response = okHttpClient.newCall(request).execute();
  19.             String result = response.body().string();
  20.             Log.d("androixx.cn",result);
  21.             response.body().close();
  22.         } catch (IOException e) {
  23.             e.printStackTrace();
  24.         }
复制代码
以上代码就是Json格式的数据传递。代码中的MediaType指定传递的数据类型,是一种MIME类型,比如application/json、application/octet-stream、application/xml等详细参考这里
对比Form表单数据传递和Json格式数据传递,对于纯粹的android程序员来说,可能觉得一个使用的是FormBody、一个使用的是RequestBody+Json,好像没有什么不同,都是key:value格式。但是对于Web后台接收的方式会有所不同,所以将原本应该是Form表单参数改成Json参数传递,后台将接受不到前端传递的参数,因为其媒体类型(MediaType)不一样。
  • String字符串传递
如果传递的就是一个纯粹的String字符串,可以将MediaType类型换成“text/plain".
说明:对于android程序员怎么知道该使用Form表单格式的数据传递方式,还是Json格式的数据传递方式?这个问题取决于后台的数据接收逻辑;所以,在实际开发中如果没有特殊说明的情况下,默认采用表单格式的数据传递;如果有特殊说明,那根据说明内容进行传递。不过,目前大多数公司要么采用form表单,要么采用Json(说白了,Json其实就是一个特殊格式的String对象)。

  • Post异步请求
Post异步请求只需要将同步请求中的execute方法换成enqueue方法。
  1. OkHttpClient okHttpClient = new OkHttpClient();
  2.         //Form表单格式的参数传递
  3.         FormBody formBody = new FormBody
  4.                 .Builder()
  5.                 .add("username","androidxx.cn")//设置参数名称和参数值
  6.                 .build();
  7.         Request request = new Request
  8.                 .Builder()
  9.                 .post(formBody)//Post请求的参数传递
  10.                 .url(Config.LOCALHOST_POST_URL)
  11.                 .build();
  12.         okHttpClient.newCall(request).enqueue(new Callback() {
  13.             @Override
  14.             public void onFailure(Call call, IOException e) {}

  15.             @Override
  16.             public void onResponse(Call call, Response response) throws IOException {
  17.                 //此方法运行在子线程中,不能在此方法中进行UI操作。
  18.                 String result = response.body().string();
  19.                 Log.d("androixx.cn", result);
  20.                 response.body().close();
  21.             }
  22.         });
复制代码


  • 总结
OkHttp是一个类似HttpUrlConnection的一个框架。
OkHttp是一个可以在Java项目和Android项目中使用的框架。所以其内部并没有Handler类来完成线程间的通信。所以,对于android而言,其返回的结果都是在子线程中。需要程序人自己写Handler完成数据传递。
OkHttp的Post和Get请求都有2中方式:同步和异步。其中同步请求不能直接在UI线程中进行。
Get和Post只是Http协议中的一块,2者的主要区别在数据的传递。学些的时候,可以从数据的传递入手去理解它们。
OkHttp使用建议在一个项目中只有一个OkHttp对象。使用前可以对OkHttp进行封装。
  • 简易封装代码如下:
  1. /**
  2. * Created by yangjw on 2016/4/24.
  3. * url:androidxx.cn
  4. * desc:TODO
  5. */
  6. public class OkHttpUtil {

  7.     //保证OkHttpClient是唯一的
  8.     private static OkHttpClient okHttpClient;

  9.     static Handler mHandler = new Handler();

  10.     static {
  11.         if (okHttpClient == null) {
  12.             okHttpClient = new OkHttpClient();
  13.         }
  14.     }

  15.     /**
  16.      * Get请求
  17.      * @param url
  18.      * @param callback 回调函数
  19.      */
  20.     public static void httpGet(String url, final IOkCallBack callback) {

  21.         if (callback == null) throw new NullPointerException("callback is null");

  22.         Request request = new Request.Builder().url(url).build();
  23.         okHttpClient.newCall(request).enqueue(new Callback() {
  24.             @Override
  25.             public void onFailure(Call call, final IOException e) {
  26.                 mHandler.post(new Runnable() {
  27.                     @Override
  28.                     public void run() {
  29.                         callback.onException(e);
  30.                     }
  31.                 });
  32.             }

  33.             @Override
  34.             public void onResponse(Call call, Response response) throws IOException {
  35.                 final String result = response.body().string();
  36.                 mHandler.post(new Runnable() {
  37.                     @Override
  38.                     public void run() {
  39.                         callback.onSuccess(result);
  40.                     }
  41.                 });
  42.                 response.body().close();
  43.             }
  44.         });
  45.     }

  46.     /**
  47.      * Post请求
  48.      * @param url
  49.      * @param params 参数
  50.      * @param callback 回调函数
  51.      */
  52.     public static void httpPost(String url,Map<String,String> params,final IOkCallBack callback) {
  53.         if (callback == null) throw new NullPointerException("callback is null");
  54.         if (params == null) throw new NullPointerException("params is null");

  55.         FormBody.Builder formBodyBuilder = new FormBody.Builder();
  56.         Set<String> keySet = params.keySet();
  57.         for(String key:keySet) {
  58.             String value = params.get(key);
  59.             formBodyBuilder.add(key,value);
  60.         }
  61.         FormBody formBody = formBodyBuilder.build();

  62.         Request request = new Request
  63.                 .Builder()
  64.                 .post(formBody)
  65.                 .url(url)
  66.                 .build();
  67.         okHttpClient.newCall(request).enqueue(new Callback() {
  68.             @Override
  69.             public void onFailure(Call call, final IOException e) {
  70.                 mHandler.post(new Runnable() {
  71.                     @Override
  72.                     public void run() {
  73.                         callback.onException(e);
  74.                     }
  75.                 });

  76.             }

  77.             @Override
  78.             public void onResponse(Call call, Response response) throws IOException {
  79.                 final String result = response.body().string();
  80.                 mHandler.post(new Runnable() {
  81.                     @Override
  82.                     public void run() {
  83.                         callback.onSuccess(result);
  84.                     }
  85.                 });
  86.                 response.body().close();
  87.             }
  88.         });
  89.     }
  90. }
复制代码



本文章的源码:Github
3 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五岁儿童抵抗力差怎么办 3岁儿童抵抗力差怎么办 四岁儿童抵抗力差怎么办 我孩子和我相冲怎么办 儿子不热母亲怎么办?单身呀? 大兔子吃小兔子怎么办 车窗贴膜里面有灰尘怎么办 陌陌小游戏不能玩游戏怎么办 电脑游戏里面的出现俄文怎么办 龙之谷手游转职业装备怎么办 如果函数值和类型不一致怎么办 qq提现不到账怎么办 提现的钱不到账怎么办 联璧金融提现不到账怎么办 孕早期拉稀拉水怎么办 兔子嘴巴摔烂了怎么办 猫咪耳朵里有黑的东西怎么办 兔子的腿骨折了怎么办 德牧耳朵立不起来怎么办 童鞋魔术贴太长了怎么办? 许昌国贸360手机没电怎么办 滴滤油膜泡泡不破怎么办 商铺转让不出去怎么办 手机导航gps信号弱怎么办 卖家收到退货有破损怎么办 手办寄快递盒子坏了怎么办 淘宝收到衣服破损的怎么办 收到的快递少了怎么办 快递寄东西坏了怎么办 发快递东西坏了怎么办 寄快递东西碎了怎么办 手机全成英文了怎么办 冲好的奶粉结块怎么办 糖有点化了怎么办弄干 猪拉黑色稀粪便怎么办 盆栽花用肥多了怎么办 辊底式退火炉出炉温度高怎么办 黑枸杞长霉了怎么办 被子睡久了发黄怎么办 丝棉被淋了雨怎么办呢? 厚棉花被有霉味怎么办