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

上篇【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

  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
OKhttp是一个常用的开源的HTTP客户端库,可以用来发送HTTP请求。在使用OKhttp进行POST请求时,需要创建一个RequestBody对象作为请求的参数。RequestBody是一个抽象类,有两个子类FormBody和MultipartBody。其中,FormBody用于传递表单信息,而MultipartBody用于传递复杂的多部分数据。 使用OKhttp进行POST请求时,可以通过以下步骤实现: 1. 创建一个OkHttpClient对象,该对象用于发送请求。 2. 创建一个RequestBody对象,并设置请求的参数。如果需要以JSON格式提交数据,可以使用MediaType.parse方法创建MediaType对象,并使用RequestBody.create方法创建RequestBody对象,并传入JSON MediaType和JSON数据。 3. 创建一个Request对象,并设置URL和请求方法为POST,并将RequestBody对象作为参数传入。 4. 使用OkHttpClient对象的newCall方法创建Call对象,并将Request对象传入。 5. 调用Call对象的enqueue方法,传入一个Callback对象,用于处理请求的响应结果。 下面是一个示例代码,演示了如何使用OKhttp进行POST请求: ```java import okhttp3.*; public class OkHttpExample { public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } } } ``` 请注意,以上示例代码仅为演示使用OKhttp进行POST请求基本步骤,具体的使用方式还需要根据实际需求进行适配和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Okhttp使用 之: post请求类型 (详解 RequestBody FormBody MultipartBody)(图片上传)](https://blog.csdn.net/u013620306/article/details/108201072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨景文Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值