前言:一般Java項目后端發送請求都使用http,最近項目里面大佬建議把http都改成okhttp3(OkHttpClient)。故今日記錄部分常用發送方式。
代碼:為了便於以后使用,這里封裝一個OkHttpUtil的工具類
1、先導入jar包:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.9.0</version> </dependency>
2、OkHttpUtil的工具類:
package cn.wj.fdata.util; import com.alibaba.fastjson.JSON; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import org.apache.commons.lang3.exception.ExceptionUtils; @Slf4j public class OkHttpUtil { public static final MediaType jsonType = MediaType.parse("application/json; charset=utf-8"); public static final MediaType mediaType = MediaType.parse("application/octet-stream"); public final OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(8000, TimeUnit.MILLISECONDS) .readTimeout(8000, TimeUnit.MILLISECONDS) .build(); /** * 發送post請求通過Form表單形式 * * @param reqUrl 請求url * @param mapParam 請求參數 * */ private void sendPostByForm(String reqUrl, Map<String,String> mapParam){ try { long startTime = System.currentTimeMillis(); //循環form表單,將表單內容添加到form builder中 FormBody.Builder formBody = new FormBody.Builder(); for (Map.Entry<String, String> m : mapParam.entrySet()) { String name = m.getKey(); String value = m.getValue()+""; formBody.add(name, value); } //構建formBody(formBody.build()),將其傳入Request請求中 Request.Builder builder = new Request.Builder().url(reqUrl).post(formBody.build()); try(Response response = okHttpClient.newCall(builder.build()).execute()){ String body = response.body().string(); log.info("{} response body:{}", reqUrl.substring(reqUrl.lastIndexOf("/") + 1), body); }catch(Exception e){ log.error("調用接口出錯\n"+ ExceptionUtils.getMessage(e)); }finally{ long endTime = System.currentTimeMillis(); log.info("{} cost time:{}", reqUrl.substring(reqUrl.lastIndexOf("/") + 1), (endTime - startTime)); } } catch (Exception e) { log.error("error", e); } } /** * 發送post請求通過JSON參數 * * @param reqUrl 請求url * @param param 請求參數 * */ private void sendPostByJson(String reqUrl, Object param){ try { String paramStr = JSON.toJSONString(param); RequestBody requestBody = RequestBody.create(jsonType, paramStr); long startTime = System.currentTimeMillis(); Request.Builder builder = new Request.Builder().url(reqUrl).post(requestBody); try(Response response = okHttpClient.newCall(builder.build()).execute()){ String body = response.body().string(); }catch(Exception e){ log.error("調用接口出錯\n"+ ExceptionUtils.getMessage(e)); }finally{ long endTime = System.currentTimeMillis(); log.info("{} cost time:{}", reqUrl.substring(reqUrl.lastIndexOf("/") + 1), (endTime - startTime)); } } catch (Exception e) { log.error("error", e); } } /** * 上傳文件 * * @param reqUrl 請求url * @param file 上傳的文件 * @param fileName 文件名稱 * */ public void uploadFile(String reqUrl, File file, String fileName) { try { RequestBody fileBody = RequestBody.create(mediaType, file); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("fileName", fileName) .addFormDataPart("file", fileName, fileBody).build(); long startTime = System.currentTimeMillis(); Request.Builder builder = new Request.Builder().url(reqUrl).post(requestBody); try(Response response = okHttpClient.newCall(builder.build()).execute()){ String body = response.body().string(); }catch(Exception e){ log.error("調用接口出錯\n"+ ExceptionUtils.getMessage(e)); }finally{ long endTime = System.currentTimeMillis(); log.info("{} cost time:{}", reqUrl.substring(reqUrl.lastIndexOf("/") + 1), (endTime - startTime)); } } catch (Exception e) { log.error("error", e); } } }
參考文章:
完!