Okhttp3最佳使用方式
一,使用前准备
要使用okhttp3,首先我们要引入相关依赖,至于版本的选择,就根据自己项目的需求了。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version>
</dependency>
二,初始化client
使用单例模式,因为,我们只需要一个okhttp3的client就行了。在初始化的时候,我们需要配置相应的参数,client的参数比较多,我们可以看自己的需求添加。
import okhttp3.*;
import java.util.concurrent.TimeUnit;
public class OkHttpClientSingle {
private OkHttpClientSingle(){
}
private static volatile OkHttpClient clientInstance;
public static OkHttpClient getClientInstance() {
if (clientInstance == null) {
synchronized (OkHttpClientSingle.class){
if (clientInstance == null){
clientInstance = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(10,5, TimeUnit.MILLISECONDS))
.retryOnConnectionFailure(true)
.build();
}
}
}
return clientInstance;
}
}
三,实现okhttp3的工具类
该工具类,主要实现了,get和post请求,又分别为带header以及不带header。post又分为form表单跟body传参的。
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.util.Map;
@Slf4j
public class Okhttp3Utils {
public static String get(String url) throws Exception{
return get(url,null);
}
public static String get(String url, Map<String,String> headers) throws Exception{
OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();
Request.Builder builder = new Request.Builder().url(url);
if(headers != null){
for (String key : headers.keySet()) {
builder.addHeader(key,headers.get(key));
}
}
Request request = builder.build();
Response res = clientInstance.newCall(request).execute();
if(!res.isSuccessful()){
log.warn("url:{} header:{} msg:{}",url,JSON.toJSONString(headers),res.message());
return null;
}
return res.body().string();
}
public static String postForm(String url, Map<String,String> formData) throws Exception{
return postForm(url,null,formData);
}
public static String postForm(String url, Map<String,String> headers, Map<String,String> formData) throws Exception{
Response response = postFormRetRes(url, headers, formData);
if(!response.isSuccessful()){
log.warn("url:{} header:{} formData:{} msg:{}",url,JSON.toJSONString(headers),JSON.toJSONString(formData),response.message());
return null;
}
return response.body().string();
}
private static Response postFormRetRes(String url, Map<String,String> headers, Map<String,String> formData) throws Exception{
OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();
RequestBody requestBody = null;
FormBody.Builder builder = new FormBody.Builder();
if(formData != null){
for (String key : formData.keySet()) {
builder.add(key,formData.get(key));
}
requestBody = builder.build();
}
Request.Builder requestBuilder = new Request.Builder().url(url);
if(requestBody != null){
requestBuilder.post(requestBody);
}
if(headers != null){
for (String key : headers.keySet()) {
requestBuilder.addHeader(key,headers.get(key));
}
}
Request request = requestBuilder.build();
Response res = clientInstance.newCall(request).execute();
return res;
}
public static String postBody(String url, Object data) throws Exception{
Response response = postBodyRetRes(url, null, data);
if(!response.isSuccessful()){
log.warn("url:{} body:{} msg:{}",url,JSON.toJSONString(data),response.message());
return null;
}
return response.body().string();
}
public static String postBody(String url, Map<String,String> headers, Object data) throws Exception{
Response response = postBodyRetRes(url, headers, data);
if(!response.isSuccessful()){
log.warn("url:{} header:{} body:{} msg:{}",url,JSON.toJSONString(headers),JSON.toJSONString(data),response.message());
return null;
}
return response.body().string();
}
public static Response postBodyRetRes(String url, Map<String,String> headers, Object data) throws Exception{
OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();
MediaType mediaType = MediaType.parse("application/json; charset=UTF-8");
RequestBody requestBody = FormBody.create(mediaType , JSON.toJSONString(data));
Request.Builder requestBuilder = new Request.Builder().url(url);
if(requestBody != null){
requestBuilder.post(requestBody);
}
if(headers != null){
for (String key : headers.keySet()) {
requestBuilder.addHeader(key,headers.get(key));
}
}
Request request = requestBuilder.build();
Response res = clientInstance.newCall(request).execute();
return res;
}
}
四,总结
okhttp3是个非常好用的http的库。要比httpclient好用多了。如果想更多的了解使用okhttp3,我还是推荐大家去官网去看看。链接: 官网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)