龙空技术网

OkHttp的基本使用——Post请求

爱音乐的程序员小新人 552

前言:

眼前兄弟们对“post请求php”大概比较关心,咱们都需要剖析一些“post请求php”的相关文章。那么小编在网络上收集了一些有关“post请求php””的相关知识,希望同学们能喜欢,朋友们一起来学习一下吧!

在介绍OkHttp的Post请求的基本使用之前,我们需要了解什么是Post,以及什么是Get?对于android程序员来说,对这2个概念不像web工程师那样熟悉,在这里我们先简要说明Post和Get请求的区别:

Post或者Get只是Http协议中向后台服务器发送数据的一种机制,是Http协议的一个组成部分。Post请求是将要提交到后台服务器的数据放在Http包的包体中。Get请求是将数据放在URL之后,比如 ... d=11&extra=page%3D1,可以看到此URL由2部分组成,分别是和?后面的参数。这就是典型的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方法中执行,否则报错(错误详见))OkHttpClient okHttpClient = new OkHttpClient(); //Form表单格式的参数传递 FormBody formBody = new FormBody .Builder() .add("goodsId","2799")//设置参数名称和参数值 .build(); Request request = new Request .Builder()<font color="royalblue"> .post(formBody)//Post请求的参数传递,此处是和Get请求相比,多出的一句代码</font>.url(Config.POST_URL) .build(); try { Response response = okHttpClient.newCall(request).execute(); String result = response.body().string(); Log.d("androixx.cn",result); response.body().close(); } catch (IOException e) { e.printStackTrace(); }

复制代码

以上是一个Post同步请求方式代码。Post请求的重点在参数的传递方式,也就是代码的第9行.post()方法。post()方法中的参数是要传递到后台服务器的参数,是一个RequestBody类型的参数。其他的代码同Get请求的基本一致。

在实际项目开发中,只要是使用Post请求方式的,都涉及参数传递。文章开头也说了,Post和Get请求的最大的不同点就在参数传递,所以接下来我们介绍一下Post的各种格式的参数传递。(注意:对于初学者,将视线重点放在Post和Get的参数传递方式上来学习OkHttp请求可能要更直观一些,也可能更容易理解)。

Form表单数据的传递(上面的代码中的FormBody就是表单参数的设置方式,表单数据的传递就不重复帖代码,代码同上)Json格式数据的传递//设置媒体类型。application/json表示传递的是一个json格式的对象 MediaType mediaType = MediaType.parse("application/json"); //使用JSONObject封装参数 JSONObject jsonObject = new JSONObject(); try { jsonObject.put("参数名","参数值"); } catch (JSONException e) { e.printStackTrace(); } //创建RequestBody对象,将参数按照指定的MediaType封装 RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString()); Request request = new Request .Builder() .post(requestBody)//Post请求的参数传递 .url(Config.POST_URL) .build(); try { Response response = okHttpClient.newCall(request).execute(); String result = response.body().string(); Log.d("androixx.cn",result); response.body().close(); } catch (IOException e) { e.printStackTrace(); }

复制代码

以上代码就是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方法。

OkHttpClient okHttpClient = new OkHttpClient(); //Form表单格式的参数传递 FormBody formBody = new FormBody .Builder() .add("username","androidxx.cn")//设置参数名称和参数值 .build(); Request request = new Request .Builder() .post(formBody)//Post请求的参数传递 .url(Config.LOCALHOST_POST_URL) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) {} @Override public void onResponse(Call call, Response response) throws IOException { //此方法运行在子线程中,不能在此方法中进行UI操作。 String result = response.body().string(); Log.d("androixx.cn", result); response.body().close(); } });

复制代码

总结

OkHttp是一个类似HttpUrlConnection的一个框架。

OkHttp是一个可以在Java项目和Android项目中使用的框架。所以其内部并没有Handler类来完成线程间的通信。所以,对于android而言,其返回的结果都是在子线程中。需要程序人自己写Handler完成数据传递。

OkHttp的Post和Get请求都有2中方式:同步和异步。其中同步请求不能直接在UI线程中进行。

Get和Post只是Http协议中的一块,2者的主要区别在数据的传递。学些的时候,可以从数据的传递入手去理解它们。

OkHttp使用建议在一个项目中只有一个OkHttp对象。使用前可以对OkHttp进行封装。

简易封装代码如下:/*** Created by yangjw on 2016/4/24.* url:androidxx.cn* desc:TODO*/public class OkHttpUtil { //保证OkHttpClient是唯一的 private static OkHttpClient okHttpClient; static Handler mHandler = new Handler(); static { if (okHttpClient == null) { okHttpClient = new OkHttpClient(); } } /** * Get请求 * @param url * @param callback 回调函数 */ public static void httpGet(String url, final IOkCallBack callback) { if (callback == null) throw new NullPointerException("callback is null"); Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { mHandler.post(new Runnable() { @Override public void run() { callback.onException(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); mHandler.post(new Runnable() { @Override public void run() { callback.onSuccess(result); } }); response.body().close(); } }); } /** * Post请求 * @param url * @param params 参数 * @param callback 回调函数 */ public static void httpPost(String url,Map<String,String> params,final IOkCallBack callback) { if (callback == null) throw new NullPointerException("callback is null"); if (params == null) throw new NullPointerException("params is null"); FormBody.Builder formBodyBuilder = new FormBody.Builder(); Set<String> keySet = params.keySet(); for(String key:keySet) { String value = params.get(key); formBodyBuilder.add(key,value); } FormBody formBody = formBodyBuilder.build(); Request request = new Request .Builder() .post(formBody) .url(url) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { mHandler.post(new Runnable() { @Override public void run() { callback.onException(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); mHandler.post(new Runnable() { @Override public void run() { callback.onSuccess(result); } }); response.body().close(); } }); }}

复制代码

标签: #post请求php #http中post请求 #form表单提交数据格式 #android上传图片到php #java 发送post