package com.tairanchina.common.util;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Request.Builder;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
/**
* @author tjf
* @ClassName: OkHttpUtil
* @Description: okhttp工具类,支持同步,异步操作
* @date 2016年11月2日下午3:15:07
*/
public class OkHttpUtil {
/**
* 静态属性和静态块它们彼此都有可能会用到对方,静态块中如果用到未初始化的静态属性
* 可在编译期约束避免它们的地位相对平等,且加载顺序也须是单线程就按照它们在代码中的出现顺序排序
*/
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
static {
mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
}
/**
* 私有防止外部实例化,创建一个新的实例 OkHttpUtil.
*/
private OkHttpUtil() {
}
/**
* @param request
* @description: 开启同步线程。
* @name: execute
* @author: hztjf
* @date: 2018/12/12 10:16
* @return: com.squareup.okhttp.Response
* @throws: IOException
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:16 修改理由
*/
public static Response execute(Request request) throws IOException {
return mOkHttpClient.newCall(request).execute();
}
/**
* @param request
* @param responseCallback
* @description: 开启异步线程访问网络
* @name: enqueue
* @author: hztjf
* @date: 2018/12/12 10:15
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:15 修改理由
*/
public static void enqueue(Request request, Callback responseCallback) {
mOkHttpClient.newCall(request).enqueue(responseCallback);
}
/**
* @param request
* @description: 开启异步线程访问网络, 且不在意返回结果(实现空callback)
* @name: enqueue
* @author: hztjf
* @date: 2018/12/12 10:15
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:15 修改理由
*/
public static void enqueue(Request request) {
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0) throws IOException {
// 异步不需要关注结果
}
@Override
public void onFailure(Request arg0, IOException arg1) {
// 异步不需要关注结果
}
});
}
/**
* @param url
* @description: 同步获取
* @name: getSync
* @author: hztjf
* @date: 2018/12/12 10:17
* @return: java.lang.Object
* @throws: IOException
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:17 修改理由
*/
public static String getSync(String url) throws IOException {
// 默认的是get方法,也可以显示调用get()方法
Request request = new Request.Builder().url(url).build();
Response response = execute(request);
if (response.isSuccessful()) {
return response.body().string();
} else {
// response.body().string()此方法只能调用一次,否则会抛出异常
String strErrMsg = response.body().string();
throw new IOException(strErrMsg);
}
}
/**
* @param url
* @param callback
* @description: 异步获取
* @name: getAsync
* @author: hztjf
* @date: 2018/12/12 10:31
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
*/
public static void getAsync(String url, Callback callback) throws IOException {
Request request = new Request.Builder().url(url).build();
enqueue(request, callback);
}
/**
* @param url
* @param mediaType
* @param requestData
* @description: 同步post提交数据
* @name: postSync
* @author: hztjf
* @date: 2018/12/12 10:31
* @return: java.lang.String
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
*/
public static String postSync(String url, MediaType mediaType, String requestData) throws IOException {
RequestBody body = RequestBody.create(mediaType, requestData);
Request request = new Request.Builder().url(url).post(body).build();
Response response = execute(request);
if (response.isSuccessful()) {
return response.body().string();
} else {
// response.body().string()此方法只能调用一次,否则会抛出异常
String strErrMsg = response.body().string();
throw new IOException(strErrMsg);
}
}
/**
* @param request
* @description: requestBody数据因为构造不同,导致参数不一致,为了统一接口,开放一个万能接口
* @name: postSync
* @author: hztjf
* @date: 2018/12/12 10:31
* @return: java.lang.String
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
*/
public static String postSync(Request request) throws IOException {
Response response = execute(request);
if (response.isSuccessful()) {
return response.body().string();
} else {
// response.body().string()此方法只能调用一次,否则会抛出异常
String strErrMsg = response.body().string();
throw new IOException(strErrMsg);
}
}
/**
* @param url
* @param mediaType
* @param requestData
* @param callback
* @description: 异步post提交数据,不必等待结果,常见的比如上传文件
* @name: postAsync
* @author: hztjf
* @date: 2018/12/12 10:30
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
*/
public static void postAsync(String url, MediaType mediaType, String requestData, Callback callback) throws
IOException {
RequestBody body = RequestBody.create(mediaType, requestData);
Request request = new Request.Builder().url(url).post(body).build();
enqueue(request, callback);
}
/**
* @param request
* @param callback
* @description: requestBody数据因为构造不同,导致参数不一致,为了统一接口,开放一个万能接口
* @name: postAsync
* @author: hztjf
* @date: 2018/12/12 10:30
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
*/
public static void postAsync(Request request, Callback callback) throws IOException {
enqueue(request, callback);
}
/**
* @param headerMap
* @param url
* @param mediaType
* @param requestData
* @description: post的另一种方式,带有构造头部
* @name: postAttachHeader
* @author: hztjf
* @date: 2018/12/12 10:30
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
*/
public static void postAttachHeader(Map<String, String> headerMap, String url, MediaType mediaType, String
requestData) throws Exception {
Builder build = new Request.Builder();
build.url(url);
bulidHeader(build, headerMap);
RequestBody body = RequestBody.create(mediaType, requestData);
build.post(body);
Request request = build.build();
Response response = execute(request);
if (response.isSuccessful()) {
return;
} else {
// response.body().string()此方法只能调用一次,否则会抛出异常
String strErrMsg = response.body().string();
throw new IOException(strErrMsg);
}
}
/**
* @param url
* @param mediaType
* @param requestData
* @description: 同步put提交数据
* @name: putSync
* @author: hztjf
* @date: 2018/12/12 10:30
* @return: java.lang.String
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
*/
public static String putSync(String url, MediaType mediaType, String requestData) throws IOException {
RequestBody body = RequestBody.create(mediaType, requestData);
Request request = new Request.Builder().url(url).put(body).build();
Response response = execute(request);
if (response.isSuccessful()) {
return response.body().string();
} else {
// response.body().string()此方法只能调用一次,否则会抛出异常
String strErrMsg = response.body().string();
throw new IOException(strErrMsg);
}
}
/**
* @param build
* @param headerMap
* @description: 构造request header
* @name: bulidHeader
* @author: hztjf
* @date: 2018/12/12 10:19
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:19 修改理由
*/
protected static void bulidHeader(Builder build, Map<String, String> headerMap) {
if (headerMap != null && headerMap.size() > 0) {
// 如果header参数多,不建议使用迭代器
Iterator<Entry<String, String>> iter = headerMap.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
build.header(entry.getKey(), entry.getValue());
}
}
}
/**
* @param build
* @param headerMap
* @description: 构造request header jdk 8实现
* @name: newBulidHeader
* @author: hztjf
* @date: 2018/12/12 10:21
* @return: void
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:21 修改理由
*/
protected static void newBulidHeader(Builder build, Map<String, String> headerMap) {
if (headerMap != null && headerMap.size() > 0) {
headerMap.forEach((k, v) -> build.addHeader(k, v));
}
}
/**
* @param url
* @param name
* @param value
* @description: 为HttpGet 的 url 方便的添加1个name value 参数
* @name: attachHttpGetParam
* @author: hztjf
* @date: 2018/12/12 10:18
* @return: java.lang.String
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:18 修改理由
*/
public static String attachHttpGetParam(String url, String name, String value) {
return url + "?" + name + "=" + value;
}
/**
* @param
* @description: 恶汉型单例模型
* @name: getInstance
* @author: hztjf
* @date: 2018/12/12 10:18
* @return: com.squareup.okhttp.OkHttpClient
* @throws: 如有特殊异常,请说明
* @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:18 修改理由
*/
public OkHttpClient getInstance() {
return mOkHttpClient;
}
}
okhttp同步异步请求工具
猜你喜欢
转载自blog.csdn.net/win7system/article/details/86541470
今日推荐
周排行