OkHttp:是Square公司的一款开源的网络请求库。它是一个高效的HTTP客户端,不过,每一次发一个请求都要写很多重复的代码,而且,如果不对其封装,如果其框架更改了一些方法,我们就得在我们自己的项目的每一处都得修改,所以为了方便使用和代码的质量,我们应该学会如何封装自己的OkHttp。
如果你还不会使用OkHttp,可以去官网去查看一下教程,或者去搜索这方面的博客。本篇章主要介绍
- 封装request
- 封装
封装request
首先我们来看一下使用OkHttp正常发送一个get请求
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(final Response response) throws IOException
{
//String htmlStr = response.body().string();
}
});
嗯,如果我们不封装的话,每一次使用一个get请求都会发送这么长的代码。好了,接下来我们看一下,封装后的用法。
CommonHttpCient.sendRequest(CommonRequest.createGetRequest("http://www.baidu.com", null),
new CommonCallback);
我们在使用request请求时,一般都会带有一定的数据,所以在些之前我自己定义了RequestParams类来处理我们的数据。
package cn.bitbitluo.developersdk.okhttp.request;
import android.os.Handler;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @作者 bitbitluo
* @date 2018/11/10 12:27
* @Description: 封装所有的请求到HashMap中
*/
public class RequestParams {
// ConcurrentHashMap是线程安全的
public ConcurrentHashMap<String, String> urlParams = new ConcurrentHashMap<>();
public ConcurrentHashMap<String, Object> fileParams = new ConcurrentHashMap<>();
public RequestParams(){this((Map<String, String>) null);}
public RequestParams(Map<String, String> source) {
if(source != null){
for (Map.Entry<String, String> entry : source.entrySet()) {
put(entry.getKey(), entry.getValue());
}
}
}
// 这个是代码块初始化,能够匿名类去访问外部的变量,如果你不会使用这个,可以看我的另外一篇文章,或者自己上网搜索。
public RequestParams(final String key, final String value) {
this(new HashMap<String, String>(){
{put(key, value);}
});
}
public void put(String key, String value) {
if (key != null && value != null) {
urlParams.put(key, value);
}
}
public void put(String key, Object object) throws FileNotFoundException {
if(key != null) {
fileParams.put(key, object);
}
}
public boolean hasParams(){
if(urlParams.size() > 0 || fileParams.size() > 0){
return true;
}
return false;
}
}
接下来我们开始封装我们的get和post方法
package cn.bitbitluo.developersdk.okhttp.request;
import java.util.Map;
import okhttp3.FormBody;
import okhttp3.Request;
/**
* @作者 bitbitluo
* @date 2018/11/10 19:02
* @Description: 给我们生成Request对象
*/
public class CommonRequest {
public static Request createPostRequest(String url, RequestParams params){
// 构建者模式
FormBody.Builder mFormBodyBuidy = new FormBody.Builder();
if(params != null){
for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
// 将请求遍历添加到请求构件类中
mFormBodyBuidy.add(entry.getKey(), entry.getValue());
}
}
// 通过请求构件类的build方法获得真正的请求体对象
FormBody mFormBody = mFormBodyBuidy.build();
return new Request.Builder().url(url).post(mFormBody).build();
}
/**
* @作者 bitbitluo
* @date 2018/11/10 19:16
* @Description: 通过传入的参数返回一个Get类型的请求
*/
public static Request createGetRequest(String url, RequestParams params) {
//StringBuilder是非线程安全的,用在这里刚刚好
StringBuilder urlBuilder = new StringBuilder(url).append("?");
if(params != null) {
for (Map.Entry<String, String> entry : params.urlParams.entrySet()) {
urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
// 我们需要把url中的最后一个&去掉
return new Request.Builder().
url(urlBuilder.substring(0, urlBuilder.length() - 1)).
get().build();
}
}
接下来我们get请求就很容易构建了,不过,这还不够,我们需要封装我们的clinet并且让它支持https。
CommonRequest.createGetRequest("http://www.baidu.com", null)
封装client
package cn.bitbitluo.developersdk.okhttp.client;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* @作者 bitbitluo
* @date 2018/11/10 19:22
* @Description: 请求的发送,请求参数的配置,https支持
*/
public class CommonHttpCient {
// 超时的参数
private static final int TIME_OUT = 30;
private static OkHttpClient mOkHttpClient;
// 配制clinet参数,并创建clinet
static {
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBuilder.readTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBuilder.writeTimeout(TIME_OUT, TimeUnit.SECONDS);
// 添加https支持
okHttpBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
okHttpBuilder.sslSocketFactory(HttpsUtils.getSslSocketFactory());
mOkHttpClient = okHttpBuilder.build();
}
/**
* @作者 bitbitluo
* @date 2018/11/10 19:43
* @Description: 发送具体的https请求
*/
public static Call sendRequest(Request request, CommCallback callback) {
Call call = mOkHttpClient.newCall(request);
call.enqueue(callback);
return call;
}
}
注意,这里我们也对回调进行了封装,让他可以直接为我们解析传回来的json
网友评论