用过鸿洋大神封装的OkHttpUtil,封装的挺好,用起来挺方便,但我觉得太复杂了,而且有的地方不满足我的要求,用起来不是很得心应手, 于是我自己写了个简单的,自己用的顺手。我自己写最大的一个原因是:服务器端返回的数据rs字段里面有的时候是个对象,有的时候是个字符串, 有的时候是个数组。常规网上介绍的都只能满足返回对象一种情况。我的这个框架能接受三种类型的返回值。
我们服务器返回的数据类型如下:
返回字符串:
{
"isReview": false,
"rs": " ",
"msg": "服务器异常",
"code": 500
}
返回对象:
{
"rs": {
"new_msg": false,
"id": 1
},
"msg": "SUCCESS",
"code": 0
}
返回数组:
{
"rs": [
{
"bookId":1234
"bookName":"aaaa"
},
{
"bookId":1235
"bookName":"bbbb"
},
{
"bookId":1236
"bookName":"cccc"
}
],
"msg": "SUCCESS",
"code": 0
}
使用方法:
1.返回字符串:
HashMap params = new HashMap();
OkHttpManager.getInstance().post(Constants.URL_BOOK_MARKET, params,
new MyGenericCallback(String.class){
@Override
public void onResponseString(String response) {
}
@Override
public void onError(int errorCode, String errorMsg) {
}
@Override
public void onAfter() {
super.onAfter();
ptr_frame.refreshComplete();
}
});
1. 返回对象
HashMap params = new HashMap();
OkHttpManager.getInstance().post(Constants.URL_BOOK_MARKET, params,
new MyGenericCallback<WeikeDataBean>(WeikeDataBean.class) {
@Override
public void onResponse(WeikeDataBean weikeDataBean) {
}
@Override
public void onError(int errorCode, String errorMsg) {
}
@Override
public void onAfter() {
super.onAfter();
ptr_frame.refreshComplete();
}
});
2.返回数组
HashMap params = new HashMap();
params.put("type", "1");
OkHttpManager.getInstance().post(Constants.URL_MY_STORE, params, new MyGenericCallback<Books>(Books.class) {
@Override
public void onResponseList(List<Books> list) {
super.onResponseList(list);
books.clear();
if (mAdapter != null) {
if (list != null && list.size() > 0) {
listview.setVisibility(View.VISIBLE);
ptr_frame.setVisibility(View.VISIBLE);
books.clear();
books.addAll(list);
} else {
listview.setVisibility(View.GONE);
ptr_frame.setVisibility(View.GONE);
tv_empty.setVisibility(View.VISIBLE);
}
listDataSave.setDataList("my_store_weike_" + AccountManager.getZhijiaoUserInfo().id, list);
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onAfter() {
super.onAfter();
closeDialog();
ptr_frame.refreshComplete();
}
});
其他特点:
1.输入参数可以是map,也可以使string,也可以是json,也可以是MultiPart文件上传。例如,下面这个”意见反馈“的应用场景是带文本和图片同时上传的:
private File file1;
private File file2;
private File file3;
Map params = new HashMap();
params.put("feedback", content);
params.put("phone", phone);
params.put("photo_one", file1);
params.put("photo_two", file2);
params.put("photo_three", file3);
OkHttpManager.getInstance().postMultiPart(ZhijiaoConstants.ZHIJIAO_NOMAL_FEEDBACK, params, new MyGenericCallback<EmptySuccessResultBean>(EmptySuccessResultBean.class) {
@Override
public void onResponse(EmptySuccessResultBean successResultBean) {
super.onResponse(successResultBean);
ToastUtil.show("感谢亲故的反馈,内容已提交");
finish();
}
});
注意上面的EmptySuccessResultBean接收rs为 {}的空对象的
2.我使用了网络上大神的Klog控件格式化打印json返回值,方便调试。compile ‘com.github.zhaokaiqiang.klog:library:0.0.1’
3.添加公共参数和header
附上最关键的一个代码类:
package com.unipus.http.okhttp;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import com.socks.library.KLog;
import com.unipus.common.AccountManager;
import com.unipus.util.CommonUtil;
import org.videolan.vlc.MainApplication;
import java.io.File;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by zhougang on 2018/9/13.
*/
public class OkHttpManager {
/**
* 网络访问要求singleton
*/
private static OkHttpManager instance;
// 必须要用的okhttpclient实例,在构造器中实例化保证单一实例
private OkHttpClient mOkHttpClient;
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private Handler mHandler;
private OkHttpManager() {
/**
* okHttp3中超时方法移植到Builder中
*/
mOkHttpClient = (new OkHttpClient()).newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(new HeaderInterceptor())
.build();
mHandler = new Handler(Looper.getMainLooper());
}
public static OkHttpManager getInstance() {
if (instance == null) {
synchronized (OkHttpManager.class) {
if (instance == null) {
instance = new OkHttpManager();
}
}
}
return instance;
}
/**
* 对外提供的Get方法访问
*
* @param url
* @param callBack
*/
public void get(String url, MyCallback callBack) {
/**
* 通过url和GET方式构建Request
*/
KLog.i(url);
Request request = bulidRequestForGet(url);
/**
* 请求网络的逻辑
*/
requestNetWork(request, callBack);
}
/**
* GET方式构建Request
*
* @param url
* @return
*/
private Request bulidRequestForGet(String url) {
return new Request.Builder()
.url(url)
.get()
.build();
}
/**
* 上传文件+文本
*
* @param url
* @param parms
* @param callBack
*/
public void postMultiPart(String url, Map<String, String> parms, MyCallback callBack) {
/**
* 通过url和POST方式构建Request
*/
KLog.i(url);
Request request = bulidRequestForPostByForm(url, parms, true);
/**
* 请求网络的逻辑
*/
requestNetWork(request, callBack);
}
/**
* 对外提供的Post方法访问
*
* @param url
* @param parms: 提交内容为表单数据
* @param callBack
*/
public void post(String url, Map parms, MyCallback callBack) {
/**
* 通过url和POST方式构建Request
*/
KLog.i(url);
Request request = bulidRequestForPostByForm(url, parms, false);
/**
* 请求网络的逻辑
*/
requestNetWork(request, callBack);
}
/**
* POST方式构建Request {Form}
*
* @param url
* @param parms
* @return
*/
private Request bulidRequestForPostByForm(String url, Map<String, String> parms, boolean isMultiPart) {
RequestBody body = null;
if (isMultiPart) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
builder = initBuilder(parms, builder);
body = builder.build();
} else {
FormBody.Builder builder = new FormBody.Builder();
builder = initBuilder(parms, builder);
body = builder.build();
}
return new Request.Builder()
.url(url)
.post(body)
.build();
}
private MultipartBody.Builder initBuilder(Map<String, String> parms, MultipartBody.Builder builder) {
if (AccountManager.getZhijiaoUserInfo() != null) {
builder.addFormDataPart("oauth_token", AccountManager.getZhijiaoUserInfo().oauth_token);
builder.addFormDataPart("openid", AccountManager.getZhijiaoUserInfo().openid);
}
String imei = "";
if (!TextUtils.isEmpty(MainApplication.getIMEI())) {
imei = MainApplication.getIMEI();
} else {
imei = "unkown";
}
builder.addFormDataPart("device_id", imei);
builder.addFormDataPart("udid", CommonUtil.getUUID());
builder.addFormDataPart("os", "android");
builder.addFormDataPart("brand", Build.MODEL);
builder.addFormDataPart("os_version", Build.VERSION.RELEASE);
builder.addFormDataPart("app_version", CommonUtil.getVersionName());
builder.addFormDataPart("lng", "0.0");
builder.addFormDataPart("lat", "0.0");
if (parms != null) {
for (Map.Entry entry : parms.entrySet()) {
if (entry.getValue() instanceof String) {
builder.addFormDataPart((String) entry.getKey(), (String) entry.getValue());
} else if (entry.getValue() instanceof File) {
File file = (File) entry.getValue();
builder.addFormDataPart((String) entry.getKey(), file.getName(), RequestBody.create(null, file));
}
}
}
return builder;
}
private FormBody.Builder initBuilder(Map<String, String> parms, FormBody.Builder builder) {
String imei = "";
if (!TextUtils.isEmpty(MainApplication.getIMEI())) {
imei = MainApplication.getIMEI();
} else {
imei = "unkown";
}
builder.add("device_id", imei);
builder.add("udid", CommonUtil.getUUID());
builder.add("os", "android");
builder.add("brand", Build.MODEL);
builder.add("os_version", Build.VERSION.RELEASE);
builder.add("app_version", CommonUtil.getVersionName());
builder.add("lng", "0.0");
builder.add("lat", "0.0");
if (parms != null) {
for (Map.Entry entry : parms.entrySet()) {
if (entry.getValue() instanceof String) {
builder.add((String) entry.getKey(), (String) entry.getValue());
}
}
}
return builder;
}
/**
* 对外提供的Post方法访问
*
* @param url
* @param json: 提交内容为json数据
* @param callBack
*/
public void post(String url, String json, MyCallback callBack) {
/**
* 通过url和POST方式构建Request
*/
Request request = bulidRequestForPostByJson(url, json);
/**
* 请求网络的逻辑
*/
requestNetWork(request, callBack);
}
/**
* POST方式构建Request {json}
*
* @param url
* @param json
* @return
*/
private Request bulidRequestForPostByJson(String url, String json) {
RequestBody body = RequestBody.create(JSON, json);
KLog.i(url);
return new Request.Builder()
.url(url)
.post(body)
.build();
}
private void requestNetWork(final Request request, final MyCallback callBack) {
/**
* 处理连网逻辑,此处只处理异步操作enqueue
*/
callBack.onBefore(request);
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
Log.e("okHttpError", "请求出错" + e.getMessage());
}
});
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
if (response.isSuccessful()) {
final String json = response.body().string();
KLog.json(json);
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(json);
callBack.onAfter();
}
});
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onAfter();
}
});
}
response.body().close();
}
});
}
}