Java請求Http接口OkHttp超詳細(xì)講解(附帶工具類)
簡介:
OkHttp是一個默認(rèn)有效的HTTP客戶端,有效地執(zhí)行HTTP可以加快您的負(fù)載并節(jié)省帶寬,如果您的服務(wù)有多個IP地址,如果第一次連接失敗,OkHttp將嘗試備用地址。這對于IPv4 + IPv6和冗余數(shù)據(jù)中心中托管的服務(wù)是必需的。OkHttp啟動具有現(xiàn)代TLS功能(SNI,ALPN)的新連接,并在握手失敗時回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。對于Java,最低要求是1.7。
操作步驟:
1、創(chuàng)建OkhttpClient。
2、mClient執(zhí)行newCall將Request轉(zhuǎn)化成一個Call。
3、最后call執(zhí)行excute同步執(zhí)行,enqueue異步執(zhí)行。
4、Request主要通過Request.Builder來構(gòu)建。
5、緩存。
6、取消請求。
導(dǎo)包
<!--okhttp3--> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency>
GET請求
get無參
/** * 以get方式調(diào)用第三方接口 * @param url */ public static void doGet1(String url) throws IOException { OkHttpClient okHttpClient = new OkHttpClient(); final Request request = new Request.Builder() .url(url) .get()//默認(rèn)就是GET請求,可以不寫 .build(); Response response = okHttpClient.newCall(request).execute(); String string = response.body().string(); System.out.println(string); }
get有參
public static void doGet2(String url, Map<String, Object> paramMap) throws IOException { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder requestbuilder = new Request.Builder() .get();//默認(rèn)就是GET請求,可以不寫 StringBuilder urlbuilder = new StringBuilder(url); if (Objects.nonNull(paramMap)) { urlbuilder.append("?"); paramMap.forEach((key, value) -> { try { urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }); urlbuilder.deleteCharAt(urlbuilder.length() - 1); } Request request = requestbuilder.url(urlbuilder.toString()).build(); Response response = okHttpClient.newCall(request).execute(); String string = response.body().string(); System.out.println(string); }
get帶參數(shù)和請求頭
/** * 以get方式調(diào)用第三方接口 * @param url */ public static void doGet3(String url, Map<String, Object> paramMap,Map<String, String> heardMap) throws IOException { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder requestbuilder = new Request.Builder() .get();//默認(rèn)就是GET請求,可以不寫 //增加參數(shù) StringBuilder urlbuilder = new StringBuilder(url); if (Objects.nonNull(paramMap)) { urlbuilder.append("?"); paramMap.forEach((key, value) -> { try { urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }); urlbuilder.deleteCharAt(urlbuilder.length() - 1); } //增加請求頭 Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString()); for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) { heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue()); } Request request = heardBuilder.build(); Response response = okHttpClient.newCall(request).execute(); System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); }
get請求 換種方式獲取結(jié)果
/** * 以get方式調(diào)用第三方接口 * @param url */ public static void doGet(String url,Map<String, Object> paramMap,Map<String, String> heardMap) { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder requestbuilder = new Request.Builder() .get();//默認(rèn)就是GET請求,可以不寫 //增加參數(shù) StringBuilder urlbuilder = new StringBuilder(url); if (Objects.nonNull(paramMap)) { urlbuilder.append("?"); paramMap.forEach((key, value) -> { try { urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }); urlbuilder.deleteCharAt(urlbuilder.length() - 1); } //增加請求頭 Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString()); for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) { heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue()); } Request request = heardBuilder.build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { System.out.println( "onFailure: "); } @Override public void onResponse(Call call, Response response) throws IOException { System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); } }); }
POST請求
post-json傳參
/** * post請求 * @param url * @param json */ public static void doPost(String url, String json, Map<String, String> heardMap) throws IOException { MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); String requestBody = json; Request.Builder requestbuilder = new Request.Builder() .url(url) .post(RequestBody.create(mediaType, requestBody)); //增加請求頭 for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) { requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue()); } Request request = requestbuilder.build(); OkHttpClient okHttpClient = new OkHttpClient(); Response response = okHttpClient.newCall(request).execute(); System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); }
post-params傳參
/** * post請求 * @param url * @param json */ public static void doPost(String url, String json, Map<String, String> heardMap) throws IOException { MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); String requestBody = json; Request.Builder requestbuilder = new Request.Builder() .url(url) .post(RequestBody.create(mediaType, requestBody)); //增加請求頭 for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) { requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue()); } Request request = requestbuilder.build(); OkHttpClient okHttpClient = new OkHttpClient(); Response response = okHttpClient.newCall(request).execute(); System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); }
/** * post請求 * @param url * @param paramMap */ public static void doPost1(String url, Map<String, Object> paramMap,Map<String,String> heardMap) throws IOException { FormBody.Builder formBody = new FormBody.Builder(); if (Objects.nonNull(paramMap)) { paramMap.forEach((x, y) -> formBody.add(x, (String) y)); } RequestBody requestBody = formBody.build(); Request.Builder requestbuilder = new Request.Builder() .url(url) .post(requestBody); //增加請求頭 for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) { requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue()); } Request request = requestbuilder.build(); OkHttpClient okHttpClient = new OkHttpClient(); Response response = okHttpClient.newCall(request).execute(); System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); }
post-表單傳參-上傳文件
達(dá)到類似效果
public static void doPost2(String url,File file) throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("id", "111") .addFormDataPart("content", "{\"do_layout\":1}") .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file)) .build(); Request request = new Request.Builder() .url(url) .post(body) .addHeader("x-tilake-app-key", "") .addHeader("x-tilake-ca-timestamp", "") .addHeader("x-tilake-ca-signature", "") .addHeader("Content-Type", body.contentType().toString()) .addHeader("Accept", "*/*") .build(); try { Response response = client.newCall(request).execute(); System.out.println(response.body().string()); System.out.println(response.message()); System.out.println(response.code()); } catch (IOException e) { throw new RuntimeException(e); } }
提供一個工具類,可以直接使用
package com.example.httpdemo.okhttp; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.apache.commons.io.FileUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; @Slf4j public class OkHttpUtil { public static final String MEDIA_TYPE_JSON = "application/json; charset=utf-8"; private OkHttpUtil() { } /** * 獲取默認(rèn)的OkHttpClient * @return */ public static OkHttpClient getOkHttpClient() { return getOkHttpClient(60, 60, 60); } public static OkHttpClient getOkHttpClient(int connectTimeout, int readTimeOut, int writeTimeOut) { OkHttpClient.Builder builder = new okhttp3.OkHttpClient().newBuilder(); builder.connectTimeout(connectTimeout, TimeUnit.SECONDS); builder.readTimeout(readTimeOut, TimeUnit.SECONDS); builder.writeTimeout(writeTimeOut, TimeUnit.SECONDS); return builder.build(); } /** * get請求 * @param okHttpClient * @param url * @param headers header參數(shù) * @return */ public static String get(OkHttpClient okHttpClient, String url, Headers headers) { log.info("okHttpClient get url:{}.", url); Request request = new Request.Builder().url(url).headers(headers).get().build(); String responseData = request(okHttpClient, url, request); log.info("okHttpClient get url:{},request responseData====> {}", url, responseData); return responseData; } public static String get(OkHttpClient okHttpClient, String url) { Headers headers = new Headers.Builder().build(); return get( okHttpClient, url, headers); } /** * GET請求。使用默認(rèn)的 okHttpClient 和 headers * @param url * @return */ public static String get(String url) { OkHttpClient okHttpClient = getOkHttpClient(); Headers headers = new Headers.Builder().build(); return get( okHttpClient, url, headers); } /** * post請求,獲取響應(yīng)結(jié)果 * * @param okHttpClient * @param url * @param bodyJson * @param headers * @return */ public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson, Headers headers) { log.info("okHttpClient post url:{}, body====> {}", url, bodyJson); MediaType mediaTypeJson = MediaType.parse(MEDIA_TYPE_JSON); RequestBody requestBody = RequestBody.create(mediaTypeJson, JSON.toJSONString(bodyJson)); Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build(); String responseData = request(okHttpClient, url, request); log.info("okHttpClient post url:{},post responseData====> {}", url, responseData); return responseData; } public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson) { Headers headers = new Headers.Builder().build(); return post( okHttpClient, url, bodyJson, headers); } /** * post請求。使用默認(rèn)的 okHttpClient 和 headers * @param url * @param bodyJson * @return */ public static String post( String url, JSONObject bodyJson) { //使用默認(rèn)的 okHttpClient OkHttpClient okHttpClient = getOkHttpClient(); Headers headers = new Headers.Builder().build(); //如果需要自定義 okHttpClient或headers傳參,可以調(diào)用以下方法 return post( okHttpClient, url, bodyJson, headers); } /** * 獲取響應(yīng)結(jié)果 * * @param okHttpClient * @param url * @param request * @return */ public static String request(OkHttpClient okHttpClient, String url, Request request) { String responseData = ""; try (Response response = okHttpClient.newCall(request).execute()) { if (response != null && response.body() != null) { return response.body().string(); } } catch (Exception e) { log.error("okHttpClient getResponse error.url:{}", url, e); } return responseData; } /** * 上傳文件 * * @param okHttpClient okHttp客戶端 * @param url 上傳文件的url * @param fileKey 文件對應(yīng)的key * @param formDataJson form-data參數(shù) * @param headers * @param file * @return */ public static String uploadFile(OkHttpClient okHttpClient, String url, String fileKey, File file, JSONObject formDataJson, Headers headers) { log.info("uploadFile url:{}, uploadFile formDataJson====> {}", url, formDataJson); // 支持傳文件的同時,傳參數(shù)。 MultipartBody requestBody = getMultipartBody(fileKey, file, formDataJson); // 構(gòu)建request請求體 Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build(); String responseData = request(okHttpClient, url, request); // 會在本地產(chǎn)生臨時文件,用完后需要刪除 if (file.exists()) { file.delete(); } return responseData; } /** * 上傳文件 * @param url * @param fileKey form-data文件對應(yīng)的key * @param multipartFile 文件上傳對應(yīng)的 multipartFile * @param formDataJson form-data參數(shù) * @return */ public static String uploadFile(String url, String fileKey, MultipartFile multipartFile, JSONObject formDataJson) { //使用默認(rèn)的okHttpClient OkHttpClient okHttpClient = getOkHttpClient(); Headers headers = new Headers.Builder().build(); return uploadFile(okHttpClient, url, fileKey, getFile(multipartFile), formDataJson, headers); } public static String uploadFile(OkHttpClient okHttpClient, String url, String fileKey, File file, JSONObject formDataJson) { Headers headers = new Headers.Builder().build(); return uploadFile(okHttpClient, url, fileKey, file, formDataJson, headers); } /** * 上傳文件 * 使用默認(rèn)的okHttpClient * * @param url * @param fileKey form-data文件對應(yīng)的key * @param file 文件 * @param formDataJson form-data參數(shù) * @return */ public static String uploadFile(String url, String fileKey, File file, JSONObject formDataJson) { //使用默認(rèn)的okHttpClient OkHttpClient okHttpClient = getOkHttpClient(); Headers headers = new Headers.Builder().build(); return uploadFile(okHttpClient, url, fileKey, file, formDataJson, headers); } /** * 上傳文件用。構(gòu)建form-data 參數(shù) * * @param fileKey 文件對應(yīng)的key * @param file 文件 * @param formDataJson form-data參數(shù) * @return */ public static MultipartBody getMultipartBody(String fileKey, File file, JSONObject formDataJson) { RequestBody fileBody = RequestBody.create(MultipartBody.FORM, file); MultipartBody.Builder bodyBuilder = new MultipartBody.Builder(); // 設(shè)置傳參為form-data格式 bodyBuilder.setType(MultipartBody.FORM); bodyBuilder.addFormDataPart(fileKey, file.getName(), fileBody); // 添加 form-data參數(shù) for (Map.Entry<String, Object> entry : formDataJson.entrySet()) { //參數(shù)通過 bodyBuilder.addFormDataPart(key, value) 添加 bodyBuilder.addFormDataPart(entry.getKey(), Objects.toString(entry.getValue(),"")); } return bodyBuilder.build(); } /** * 獲取文件 * @param multipartFile * @return */ public static File getFile(MultipartFile multipartFile) { File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename())); try { FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file); } catch (IOException e) { log.error("copyInputStreamToFile error.", e); } return file; } }
總結(jié)
到此這篇關(guān)于Java請求Http接口OkHttp的文章就介紹到這了,更多相關(guān)Java請求Http接口OkHttp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java如何基于okhttp請求SSE接口流式返回詳解
- java+Okhttp3調(diào)用接口的實例
- Java中的HttpServletRequest接口詳細(xì)解讀
- Java調(diào)用HTTPS接口實現(xiàn)繞過SSL認(rèn)證
- Java調(diào)用第三方http接口的四種方式總結(jié)
- Java發(fā)送http請求調(diào)用第三方接口獲取token方式
- Java調(diào)用第三方http接口的常用方式總結(jié)
- Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù)
- Java 調(diào)用 HTTP 接口的 7 種方式示例代碼(全網(wǎng)最全指南)
相關(guān)文章
Jmeter對接口測試入?yún)崿F(xiàn)MD5加密
這篇文章主要介紹了Jmeter對接口測試入?yún)崿F(xiàn)MD5加密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08Java常用HASH算法總結(jié)【經(jīng)典實例】
這篇文章主要介紹了Java常用HASH算法,結(jié)合實例形式總結(jié)分析了Java常用的Hash算法,包括加法hash、旋轉(zhuǎn)hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以參考下2017-09-09Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題
這篇文章主要介紹了Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細(xì)介紹
這篇文章主要介紹了JAVA加密算法- 非對稱加密算法(DH,RSA),詳細(xì)介紹了DH,RSA的用法和示例,需要的朋友可以了解一下。2016-11-11