需求: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);
}