OkHttp是Square公司开发的一款处理网络请求的开源框架。鉴于OkHttp的使用口碑相当不错,Google好像在6.0版本以后直接将其源码引入,并且删除了HttpClient的相关API,可见OkHttp使用之广泛。笔者曾经也使用过,鉴于水平有限,用过之后就抛诸脑后了,所以写一篇文章记录一下,本文不探讨其源码,只是简单的介绍我在项目中的使用过程。
首先添加依赖
compile 'com.squareup.okhttp:okhttp:3.0.1'
compile 'com.squareup.okio:okio:1.7.0'
官网对okio的解释是用于快速I/O和可调整的缓冲区。所以在使用OkHttp时加上此依赖。当然,我们使用网络请求还需要在manifest中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
GET请求,java代码如下
//创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//创建一个请求,url为访问路径
Request request = new Request.Builder().url(url).build();
//发起请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i(TAG,"IOException--"+e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG,"response--"+response.body().toString());
}
});
我们发现OkHttp更新到3.0+后,不能直接通过OkHttpClient设置超时时间和缓存了,而是通过OkHttpClient.builder来设置。所以我们就不直接new OkHttpClient了,而是通过OkHttpClient的builder的build方法来获取OkHttpClient。后面请求的代码是一样的,就不重复贴出了
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//连接超时设置
builder.connectTimeout(10, TimeUnit.SECONDS);
//写超时
builder.writeTimeout(20,TimeUnit.SECONDS);
//读超时
builder.readTimeout(15,TimeUnit.SECONDS);
//得到okHttpClient实例
OkHttpClient okHttpClient = builder.build();
总结一下,我们使用OkHttp的Get请求步骤就是新建OkHttpClient ,建立Reuest请求,最后call.enqueue()。
POST请求
与异步GET请求非常类似,只是要封装请求的参数,并传递给Request。
首先,我们要定义提交数据的类型,比如String,Json等。我们使用MediaType。MediaType在网络协议的消息头里面叫做Content-Type,使用两部分的标识符来确定一个类型。如果想要提交的数据是字符串或者Json,可以写作
//提交数据:Json格式
private static final MediaType JSON = MediaType.parse("application/json;charset=utf-8");
//提交字符串
private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown;charset=utf-8");
这样就是为了表明我们要传的东西是什么类型,当然还可以传不同类型,这里就不细说了。
Java代码
OkHttpClient okHttpClient = new OkHttpClient();
//创建请求
Request request = new Request.Builder()
.url(url) //访问路径
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN,"CONTENT"))//用post方法提交字符串“CONTENT”,根据实际情况提交
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
当然,还有的时候,我们会提交多个数据,我们可以使用post的表单提交,代码都大同小异,我们仅需要以键值对的形式,将数据封装在FormBody里就可以了。Java代码如下:
//建立表单数据
FormBody.Builder builder = new FormBody.Builder();
builder.add("name1","value1");//要提交的数据1
builder.add("name2","value2");//要提交的数据2
RequestBody build = builder.build();//请求体
Request request = new Request.Builder()//请求
.url(url)
.post(build)
.build();
OkHttpClient client = new OkHttpClient();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
接下来,我们来讲一下用post方法提交json数据,这个应该是项目里经常用到的(接收json,提交json)
首先,我们需要一个MediaType,上面有提到
//提交Json字符串
private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json;charset=utf-8");
然后,就是要创建请求体,创建json字符串,java代码如下:
JSONObject object = new JSONObject();
try {
object.put("username","xxxx");
object.put("passWord","yyyy");
} catch (JSONException e) {
e.printStackTrace();
}
String json_String = object.toString();
RequestBody body = RequestBody.create(MEDIA_TYPE_JSON,json_String);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
好了,就暂时讲到这里,这只是OkHttp最简单的应用,这篇文章只是回顾一下基本用法,有没有发现,每使用一次,都有很多重复的代码。这样肯定不利于我们代码复用,最好的办法就是封装,封装成工具类,用的时候直接调用就可以了。