okhttp參數字符串+文件post提交

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章