Java請(qǐng)求Http接口OkHttp超詳細(xì)講解(附帶工具類)
簡(jiǎn)介:
OkHttp是一個(gè)默認(rèn)有效的HTTP客戶端,有效地執(zhí)行HTTP可以加快您的負(fù)載并節(jié)省帶寬,如果您的服務(wù)有多個(gè)IP地址,如果第一次連接失敗,OkHttp將嘗試備用地址。這對(duì)于IPv4 + IPv6和冗余數(shù)據(jù)中心中托管的服務(wù)是必需的。OkHttp啟動(dòng)具有現(xiàn)代TLS功能(SNI,ALPN)的新連接,并在握手失敗時(shí)回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。對(duì)于Java,最低要求是1.7。
操作步驟:
1、創(chuàng)建OkhttpClient。
2、mClient執(zhí)行newCall將Request轉(zhuǎn)化成一個(gè)Call。
3、最后call執(zhí)行excute同步執(zhí)行,enqueue異步執(zhí)行。
4、Request主要通過Request.Builder來構(gòu)建。
5、緩存。
6、取消請(qǐng)求。
導(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請(qǐng)求
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請(qǐng)求,可以不寫
.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請(qǐng)求,可以不寫
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ù)和請(qǐng)求頭
/**
* 以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請(qǐng)求,可以不寫
//增加參數(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);
}
//增加請(qǐng)求頭
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請(qǐng)求 換種方式獲取結(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請(qǐng)求,可以不寫
//增加參數(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);
}
//增加請(qǐng)求頭
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請(qǐng)求
post-json傳參
/**
* post請(qǐng)求
* @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));
//增加請(qǐng)求頭
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請(qǐng)求
* @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));
//增加請(qǐng)求頭
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請(qǐng)求
* @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);
//增加請(qǐng)求頭
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);
}
}
提供一個(gè)工具類,可以直接使用
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請(qǐng)求
* @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請(qǐng)求。使用默認(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請(qǐng)求,獲取響應(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請(qǐng)求。使用默認(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 文件對(duì)應(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í),傳參數(shù)。
MultipartBody requestBody = getMultipartBody(fileKey, file, formDataJson);
// 構(gòu)建request請(qǐng)求體
Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();
String responseData = request(okHttpClient, url, request);
// 會(huì)在本地產(chǎn)生臨時(shí)文件,用完后需要?jiǎng)h除
if (file.exists()) {
file.delete();
}
return responseData;
}
/**
* 上傳文件
* @param url
* @param fileKey form-data文件對(duì)應(yīng)的key
* @param multipartFile 文件上傳對(duì)應(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文件對(duì)應(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 文件對(duì)應(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請(qǐng)求Http接口OkHttp的文章就介紹到這了,更多相關(guān)Java請(qǐng)求Http接口OkHttp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案
今天小編就為大家分享一篇關(guān)于Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
SpringBoot使用Quartz無法注入Bean的問題及解決
這篇文章主要介紹了SpringBoot使用Quartz無法注入Bean的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring @Bean vs @Service注解區(qū)別
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Java創(chuàng)建多線程異步執(zhí)行實(shí)現(xiàn)代碼解析
這篇文章主要介紹了Java創(chuàng)建多線程異步執(zhí)行實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
使用Java將實(shí)體類轉(zhuǎn)換為JSON并輸出到控制臺(tái)的完整過程
在軟件開發(fā)的過程中,Java是一種廣泛使用的編程語言,而在眾多應(yīng)用中,數(shù)據(jù)的傳輸和存儲(chǔ)經(jīng)常需要使用JSON格式,用Java將實(shí)體類轉(zhuǎn)換為JSON格式并輸出其實(shí)不難,只需掌握幾個(gè)步驟就可以做到!接下來,我們來看看這一過程究竟是如何實(shí)現(xiàn)的,感興趣的小伙伴跟著小編一起來看看吧2025-05-05

