需求:1.使用okhttp发起请求,请求参数中带包含字符串参数、二进制文件参数,直接看下面代码:
依赖引入:
<!--okhttp-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.14.0</version>
</dependency>
封装后的OkHttpUtil.java
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Call;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.MultipartBody.Builder;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
*
* @类名称 HttpUtils.java
* @类描述 <pre></pre>
* @作者 yw
* @创建时间 2020年5月25日 下午10:47:03
* @版本 5.0.0
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 5.0.0 yw 2020年5月25日
* ----------------------------------------------
* </pre>
*/
@Slf4j
public class OkHttpUtil {
private static final MediaType MEDIA_TYPE_STREAM = MediaType.parse("application/octet-stream");//流类型
private static final byte[] LOCKER = new byte[0];
private static OkHttpUtil instance;
private OkHttpClient okHttpClient;
/**
* 构造初始化参数
*/
private OkHttpUtil() {
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)//10秒连接超时
.writeTimeout(10, TimeUnit.SECONDS)//10m秒写入超时
.readTimeout(10, TimeUnit.SECONDS)//10秒读取超时
.build();
}
/**
*
* @方法名称 getInstance
* @功能描述 <pre>单例获得http实例</pre>
* @作者 yw
* @创建时间 2020年4月30日 下午11:34:59
* @return
*/
public static OkHttpUtil getInstance() {
if (instance == null) {
synchronized (LOCKER) {
if (instance == null) {
instance = new OkHttpUtil();
}
}
}
return instance;
}
/**
*
* @方法名称 doPostFormAndFile
* @功能描述 <pre>封装后的方法 发起请求的方法</pre>
* @作者 yw
* @创建时间 2020年5月26日 上午12:55:02
* @param url
* @param params
* @return
* @throws UnsupportedEncodingException
*/
public String doPostFormAndFile(String url, Map<String, String> params) throws UnsupportedEncodingException{
if (isBlankUrl(url)) {
return null;
}
Request request = getRequestForPostForm(url, params);
return commonRequest(request);
}
private Boolean isBlankUrl(String url){
if (StringUtil.isBlank(url)){
log.info("url is not blank");
return true;
}else{
return false;
}
}
/**
*
* @方法名称 getRequestForPostForm
* @功能描述 <pre>封装请求体 post form 组织参数 这个方法可以进一步优化 为了看着清晰,把参数都列出来</pre>
* @作者 yw
* @创建时间 2020年4月30日 下午11:30:50
* @param url
* @param params
* @return
* @throws UnsupportedEncodingException
*/
private Request getRequestForPostForm(String url, Map<String, String> params) throws UnsupportedEncodingException {
byte[] Filedata = null;
try {
Filedata = FileUtils.getUrlFileData(params.get("headUrl"));//资源url
} catch (Exception e) {
e.printStackTrace();
}
Builder builder = new MultipartBody.Builder();
//多个参数循环组装
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
if("headUrl".equals(entry.getKey())){
builder.addFormDataPart("headUrl", URLEncoder.encode(params.get("fileName"), "UTF-8"),
RequestBody.create(MEDIA_TYPE_STREAM, Filedata));//头像文件为一个url地址
}else{
builder.addFormDataPart(entry.getKey(), entry.getValue());
}
}
}
//构建请求体
RequestBody muiltipartBody = builder
.setType(MultipartBody.FORM)
.build();
//构建请求
Request request = new Request.Builder()
.url(url)
.post(muiltipartBody)
.build();
return request;
}
/**
*
* @方法名称 commonRequest
* @功能描述 <pre>封装的公用发起请求方法</pre>
* @作者 yw
* @创建时间 2020年4月30日 下午11:31:26
* @param request
* @return
*/
private String commonRequest(Request request){
String re = "";
try {
Call call = okHttpClient.newCall(request);
Response response = call.execute();
if (response.isSuccessful()){
re = response.body().string();
log.info("request url:{};response:{}", request.url().toString(), re);
}else {
log.info("request failure url:{};message:{}", request.url().toString(), response.message());
}
}catch (Exception e){
log.error("request execute failure", e);
}
return re;
}
}
测试:
public static void main(String args[]) throws UnsupportedEncodingException{
String url = "请求的服务器地址";
Map<String, String> params = new HashMap<>();
params.put("userName", "张三");
params.put("password", "123456");
//头像 url
params.put("headUrl", "http://img1.imgtn.bdimg.com/it/u=3147590882,1934776101&fm=26&gp=0.jpg");
params.put("fileName", "魔法美少女");
OkHttpUtil.getInstance().doPostFormAndFile(url , params);
}