1、简要概述
OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
OkHttp官网地址:http://square.github.io/okhttp/
OkHttp GitHub地址:https://github.com/square/okhttp
2、配置方法
Eclipse直接导入jar依赖就行,对应最新的okhttp下载地址,另外okhttp内部依赖okio,最新的okio下载地址
AndroidStudio配置方法,直接在build.gradle中添加如下代码
compile 'com.squareup.okhttp3:okhttp:3.6.0'
或者通过选中项目,右键里选择“Open Module Settings”,然后在下图里选择搜索okhttp即可,会自动在build.gradle里添加上上面那行
配置完成后我们就来看看简单的使用
3、简单使用
3.1 利用OkHttp发送get请求
同步方法execute,代码如下
public void okHttpGetByExecute() {
OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();
Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").
build();
//当然你也可以通过Request.Builder设置更多的参数比如:header、method等
//new Request.Builder().addHeader(name ,value)
try {
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
mHandler.sendMessage(mHandler.obtainMessage());
//r注意esponse.body().toString打印的是Responsebody对象
Log.d(TAG, response.body().string());
} else {
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
Log.d(TAG, " test1 e :" + e.toString());
e.printStackTrace();
}
}
利用enqueue异步访问,代码如下
public void okHttpGetByEnqueue() {
OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();
Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").
build();
//当然你也可以通过Request.Builder设置更多的参数比如:header、method等
//new Request.Builder().addHeader(name ,value)
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
mHandler.sendMessage(mHandler.obtainMessage());
//r注意esponse.body().toString打印的是Responsebody对象
Log.d(TAG, response.body().string());
}
});
}
以上就是利用okhttp实现的两种get访问方式,简单总结下,分三步
1.构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。
2.通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute(),enqueue(),cancel()等方法
3.调用Call对象的execute()或enqueue()发起get请求
onResponse回调的参数是response,一般情况下,获得返回的字符串,可以通过response.body().string();获得返回的二进制字节数组,则调用response.body().bytes();需要返回的inputStream,则调用response.body().byteStream(),
enqueue()和execute()区别:
同步时execute()返回Response就可以更新UI,异步时在callback的onResponse触发时可更新UI。同步方法会阻塞线程,不要在UI线程使用
3.2 利用OkHttp发送post请求
public void okHttpPosyByEnqueue(String json) {
OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();
//1.通过键值对添加RequestBody start
// FormBody.Builder builder = new FormBody.Builder();
// RequestBody requestBody = builder.add("username", "jason").add("password", "123456").build();
//1.通过键值对添加RequestBody end
//2.通过json提交数据
MediaType parse = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(parse, json);
Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").post(requestBody).build();
//当然你也可以通过Request.Builder设置更多的参数比如:header、method等
//new Request.Builder().addHeader(name ,value)
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//r注意esponse.body().toString打印的是Responsebody对象
Log.d(TAG, response.body().string());
}
});
}