趁下班前发一篇短文。
热衷于使用okhttp的理由,数据压缩率高,传输数据时省流量。
今天讲解下okhttp3.x的post请求的用法,get请求与okhttp2.x一样。
我下载的是okhttp3.4.1和okio1.9.0。post请求最常用的是带参数和带内容的数据传递,时间有限就讲这两种。
第一件要说的是连接网络,android的清单记得给权限。
第二件要说的是android一定要用开个线程请求网络,别阻塞UI线程。
1.带参数的post传输。
okhttp3.x用FormBody.Builder代替过去FormEncodingBuilder用法一样的。
事例:
FormBody.Builder params=new FormBody.Builder();
params.add("data", "0");
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder()
.url(url)
.post(params.build())
.build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call arg0, Response response) throws IOException {
// 响应成功 response.body().string() 获取字符串数据,当然还可以获取其他
}
@Override
public void onFailure(Call arg0, IOException arg1) {
// 响应失败
}
params中添加键值对。
然后new一个okhttpclient,再创建一个request,把url和post参数塞进request。Call.enqueue()方法可以直接链接网络了,而且可以回调给我们成功或失败。
2.带内容的post传输。
需要用到RequestBody
事例:
RequestBody body=RequestBody.create(MediaType.parse("text/html"),"1");
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder()
.url(url)
.post(body)
.build();
try {
Response response=okHttpClient.newCall(request).execute();
response.body().string();
//这里没有用call.enqueue方式连接,用了execute方式,都一样的,写法不一样而已,看个人喜欢
} catch (IOException e) {
e.printStackTrace();//响应失败了,进行响应操作
}
这里RequestBody类有个工厂方法是create,里面放两个参数:
create(参数1,参数2)
参数1:数据类型,等于网页说的响应头最常见的是text/html,这是html网页的文本类型,还有application/json,这是json格式。
参数2:内容,支持的数据类型,byte[] ,String,ByteString,File。
以上是全部内容了,简单的post传输。
要注意一点的是,无论是带参数还是带内容,请求的方式上面提到了两种,重要的事情,再说一次,
第一种,call.enqueue加入call队列方式,可以调度,网络响应成功或失败都有回调
第二种,execute方式,这种方式快捷,没有什么回调,只要一个try/catch捕抓下异常,效果等同于第一种的回调接口。
最后做个搬运工个,okhttp3.4.1和okio1.9.0的jar包,附上链接。