前言
前面一篇博客对OkHttp进行了简单的介绍https://blog.csdn.net/wen_haha/article/details/81040573 ,简单的介绍了一下OkHttp的get、post请求以及文件的上传和下载,但是每次请求网络都要写重复的代码就很麻烦,我们这篇博客就对OkHttp进行一下简单的封装,方便使用。
意义
封装的意义在于更加方便地使用,具有拓展性,但是对OkHttp进行封装需要解决的两点是:
1.避免重复代码调用
2.将请求结果回调改为UI线程。
如果想要使用OkHttp的开源库,可以使用OKHttpFinal(Github:https://github.com/pengjianbo/OkHttpFinal)。
封装
1.配置gradle
在AndroidStudio中使用不需要下载jar包,直接添加依赖即可:
compile 'com.squareup.okhttp3:okhttp:3.10.0'
2.封装一个通用的请求创建类CommonRequest,负责创建各种类型的请求对象,包括get、post,上传文件类型。
①创建get请求
public static Request createGetRequest(String url, RequestParams params){
StringBuilder urlBuilder = new StringBuilder();
if(params != null){
for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
urlBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
}
int end = urlBuilder.length() - 1;
String fullUrl = url + urlBuilder.substring(0, (end > 0 ? end : 0)).toString();
return new Request.Builder()
.url(fullUrl)
.get()
.build();
}
需要用到RequestParams参数类
public class RequestParams {
public ConcurrentHashMap<String, String> urlParams = new ConcurrentHashMap<>();
public ConcurrentHashMap<String, Object> fileParams = new ConcurrentHashMap<>();
// TODO 构造函数
public RequestParams(Map<String, Object> source) {
if(source != null) {
for (Map.Entry<String, Object> entry : source.entrySet()) {
if(entry.getValue() instanceof File){
put(entry.getKey(), entry.getValue());
}else{
put(entry.getKey(), (String) entry.getValue());
}
}
}
}
private void put(String name, String value){
if(name == null) return;
urlParams.put(name, value);
}
private void put(String name, Object value){
fileParams.put(name, value);
}
}
②创建psot请求
public static Request createPostRequest(String url, RequestParams params){
FormBody.Builder builder = new FormBody.Builder();
if(params != null){
for(Map.Entry<String, String> entry : params.urlParams.entrySet()){
builder.add(entry.getKey(), entry.getValue());
}
}
FormBody body = builder.build();
return new Request.Builder()
.url(url)
.post(body)
.build();
}
3.创建CommonOkHttpClient,用来发送get,post请求的工具类
①设置超时时间
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
okHttpBuilder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBuilder.readTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBuilder.writeTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBuilder.followRedirects(true); // 允许自定项
②发送get请求
public static void get(String url, RequestParams params, final DisposeDataHandler handler){
try {
Request request = CommonRequest.createGetRequest(url, params);
Call call = okHttpClient.newCall(request);
call.enqueue(new CommonJsonCallBack(handler));
}catch (final Exception e){
mDelieverHandler.post(new Runnable() {
@Override
public void run() {
handler.mListener.onFailure(e);
}
});
}
}
③发送post请求
public static void post(String url, RequestParams params, final DisposeDataHandler handler){
try{
Request request = CommonRequest.createPostRequest(url, params);
Call call = okHttpClient.newCall(request);
call.enqueue(new CommonJsonCallBack(handler));
}catch (final Exception e){
mDelieverHandler.post(new Runnable() {
@Override
public void run() {
handler.mListener.onFailure(e);
}
});
}
}
4.返回格式
我们这里返回Json数据,用fastJson进行解析。
if(TextUtils.isEmpty(result)){
notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
return;
}
try {
JSONObject obj = new JSONObject(result);
if(obj.has(RESULT_CODE)){
if(obj.optInt(RESULT_CODE) == RESULT_CODE_DUCCESS){
if(clazz == null){
notifySuccess(obj);
}else{
Object clazzObj = null;
try {
clazzObj = JSON.parseObject(result, clazz);
if(clazzObj == null) {
notifyFailure(new OkHttpException(JSON_ERROR, EMPTY_MSG));
}else{
// 所有逻辑正常,返回实体对象
notifySuccess(clazzObj);
}
}catch (Exception e){
notifyFailure(new OkHttpException(JSON_ERROR, EMPTY_MSG));
}
}
}else{
notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
}
}else{
notifyFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
}
}catch (Exception e){
if(e instanceof JSONException){
notifySuccess(result);
}else {
notifyFailure(new OkHttpException(OTHER_ERROR, EMPTY_MSG));
}
}
5.调用get,post请求
①发送get请求
private void getRequest() {
CommonOkHttpClient.get("https://www.imooc.com/video/13050",null,new DisposeDataHandler(new DisposeDataListener() {
@Override
public void onSuccess(Object responseObj) {
mTvCookieShow.setText(responseObj.toString());
}
@Override
public void onFailure(Object error) {
mTvCookieShow.setText(error.toString());
}
}));
}
②发送post请求
private void postRequest() {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "jwj");
paramMap.put("password", "123456");
RequestParams params = new RequestParams(paramMap);
CommonOkHttpClient.post("http://192.168.1.92:8080/OkHttpServer/login", params, new DisposeDataHandler(new DisposeDataListener() {
@Override
public void onSuccess(Object response) {
mTvCookieShow.setText(response.toString());
}
@Override
public void onFailure(Object error) {
mTvCookieShow.setText(error.toString());
}
}));
}
总结
经过封装后的OkHttp,减少了代码的冗余,提高了代码的可复用性,大大的减少了重复代码。
Demo
CSDN
https://download.csdn.net/download/wen_haha/10545569
Github