android网络请求框架之OkHttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,但仍可引入Jar包使用)。
OkHttp是一个高效的HTTP客户端,它有以下默认特性:
功能:
使用步骤:
创建OkHttpClient对象
构造Request对象
通过OkHttpClient和Request对象来构建Call对象
通过Call对象的enqueue(Callback)方法来执行异步请求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.get() //默认就是GET请求,可以省略
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//response.body().string() 获得服务器返回的数据
Log.d(TAG, "onResponse: " + response.body().string());
}
});
前面几个步骤和异步方式一样,只是最后一步是通过 Call.execute() 来提交请求,注意这种方式会阻塞调用线程,所以在Android中应放在子线程中执行,否则有可能引起ANR异常,Android3.0 以后已经不允许在主线程访问网络。
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
final Call call = okHttpClient.newCall(request);
//创建子线程
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.d(TAG, "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
这种方式与前面的区别就是在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据。在构造 RequestBody 需要指定MediaType,用于描述请求/响应 body 的内容类型。
MediaType指的是要传递的数据的MIME类型,MediaType对象包含了三种信息:type 、subtype以及charset,一般我们会将这些信息传入parse()方法中,这样就可以解析出MediaType对象。如果不知道某种类型数据的MIME类型,可以参见MIME参考手册 较详细的列出了所有数据的MIME类型。
使用步骤:
创建OkHttpClient对象
构造mediaType对象
构造RequestBody对象
通过RequestBody构造Request对象
通过OkHttpClient和Request对象来构建Call对象
通过Call对象的enqueue(Callback)方法来执行异步请求
String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType,"RequestBody");
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: "+response.body().string());
}
});
向服务器提交表单时,使用 RequestBody 的实现类FormBody来描述请求体,它可以携带一些经过编码的 key-value 请求体,FromBody用于提交表单键值对(key-value),其作用类似于HTML中的< form >标记。
String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("username",username)
.add("password",password)
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: "+response.body().string());
}
});
使用步骤与POST提交String相同,唯一的区别就是mediaType对象要解析的MIME类型为(“application/json;charset=utf-8”)。
String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json;charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType,jsonData);
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: "+response.body().string());
}
});
官方文档:OkHttp官方文档
参考链接:okhttp3基本使用