现在我们项目中对okhttp的封装,跟大家分享一下.我们项目请求的时候是上传的json.后台解析.所有前段就很省事了.直接上代码
public classHttpOk {
/**
* 连接超时(默认:30秒)
*/
public static
intTimeOut=30;
private staticOkHttpClient
getHttpClient() {
OkHttpClient client =newOkHttpClient();
client.setConnectTimeout(TimeOut,
TimeUnit.SECONDS);
returnclient;
}
/**
* 提交json 不检测更新
*
*@param url
请求路径
*@param
requestBean 请求的json
*@param
cb 回调
*@param
resultClass 返回的实体类型
*@param
tag 用于区分网络请求
*/
public static
voidpostData(String url, Object requestBean, ACallOkHttp cb, Class<?> resultClass,inttag)
{
if(url.isEmpty())
{
return;
}
Gson gson =newGson();
String json = gson.toJson(requestBean);
// LogUtils.i("请求的json="+
json);
RequestBody formBody =newFormEncodingBuilder()
.add("data",
json)
.build();
Request request =newRequest.Builder()
.url(url)
.post(formBody)
.build();
//给回调返回的实体类
cb.registerClass(resultClass, tag);
//开始请求
cb.onBeforeRequest(tag);
getHttpClient().newCall(request).enqueue(cb);
}
/**
* 提交json和图片,文本集合
*
*@param
*@param
cb
*/
public static
voidpost(String url, Object requestBean, Map<String, String> images, ACallOkHttp cb, Class<?> resultClass,inttag)
{
MultipartBuilder builder =newMultipartBuilder().type(MultipartBuilder.FORM);
if(images
!=null) {
for(Map.Entry<String,
String> entry : images.entrySet()) {
builder.addFormDataPart(entry.getKey(), entry.getKey(),
RequestBody.create(MediaType.parse(guessMimeType(entry.getValue())),newFile(entry.getValue())));
}
}
Gson gson =newGson();
String json = gson.toJson(requestBean);
// LogUtils.d("请求的json",
json);
builder.addFormDataPart("data",
json);
//构建请求体
RequestBody requestBody = builder.build();
//构建请求
Request request =newRequest.Builder()
.url(url)//地址
.post(requestBody)//添加请求体
.build();
cb.registerClass(resultClass, tag);
cb.onBeforeRequest(tag);
getHttpClient().newCall(request).enqueue(cb);
}
/**
* 获取文件类型
*@param
path
*@return
*/
private staticString
guessMimeType(String path) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = fileNameMap.getContentTypeFor(path);
if(contentTypeFor
==null) {
contentTypeFor ="application/octet-scontentTypeFortream";
}
returncontentTypeFor;
}
}
回调类,一个请求开始,请求失败,请求成功:
public abstract classACallOkHttp implementsCallback
{
private inttag=0;
privateClass<?>resultClass=null;
Handlerhandler=newHandler()
{
@Override
public voidhandleMessage(Message
msg) {
super.handleMessage(msg);
switch(msg.what)
{
case1:
onResultRequest(msg.arg1,
msg.obj);
break;
case2:
onErrorRequest(msg.arg1,
(String) msg.obj);
break;
}
}
};
@Override
public voidonFailure(Request
request, IOException e) {
Message message =newMessage();
message.obj=
e.getLocalizedMessage();
message.arg1=tag;
message.what=2;
handler.sendMessage(message);
}
@Override
public voidonResponse(Response
response) {
Gson gson =newGson();
String json =null;
try{
json = response.body().string();
// LogUtils.i("返回来的结果="+
json);
Object bean = gson.fromJson(json,resultClass);
Message message =newMessage();
message.obj=
bean;
message.arg1=tag;
message.what=1;
handler.sendMessage(message);
}catch(IOException
e) {
e.printStackTrace();
onErrorRequest(tag,"JSON解析失败!");
}
}
public voidregisterClass(Class<?>
resultClass,inttag) {
this.resultClass=
resultClass;
this.tag=
tag;
}
/**
* 请求开始
*
*@param
tag
标签
*/
public abstract
voidonBeforeRequest(inttag);
/**
* 请求成功
*
*@param
tag
标签
*@param
bean
实体类对象
*/
public abstract
voidonResultRequest(inttag,
Object bean);
/**
* 请求失败
*
*@param
tag
标签
*@param
e
错误信息
*/
public abstract
voidonErrorRequest(inttag,
String e);
用法:
ConsultAllJson allJson =newConsultAllJson();
allJson.setPage(1);
allJson.setSize(100);
HttpOk.post(HttpPathUtils.HTTP_URL,allJson,newACallOkHttp()
{
@Override
public voidonBeforeRequest(inttag)
{
//开始请求,可以显示一个进度条,什么的
}
@Override
@Override
public voidonResultRequest(int
tag, Object bean) {
//成功之后直接强制一下,就拿到需要的实体类型了.
ConsultAllJson consultAllJson = (ConsultAllJson) bean;
}
@Override
public void onErrorRequest(inttag, String e) {
}
}
@Override
public void onErrorRequest(inttag, String e) {
}
},ConsultAllJson.class,1);
上传文本跟这个是一样的用法,就不写出来了.因为我们项目中只有psot请求,所有暂时也就写post请求,post上传文件,关于get请求,下载文件.会在下一章写出来.
以上只是我个人对okhttp的用法,如果有更好的可以一起指出来.一起探讨才能进步..
QQ群 570278493; 欢迎加入.