SpringBoot調用HTTP接口

1. RestTemplate

首先引入依賴

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

編寫配置類

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);//單位為msfactory.setConnectTimeout(5000);//單位為msreturn factory;}
}

SimpleClientHttpRequestFactory類對應的HTTP庫是JDK自帶的HttpUrlConnection,也可以修改使用其他的HTTP庫,例如HttpComponentsAsyncClientHttpRequestFactory。

這樣就可以注入使用了

    @Resourceprivate RestTemplate restTemplate;
      String url = "http://127.0.0.1/test";// 請求參數Map map = new HashMap<>();map.put("key", "111");// 設置請求頭屬性HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);HttpEntity httpEntity = new HttpEntity(map, httpHeaders);String results = restTemplate.postForObject(url, httpEntity, String.class);

2.?WebClient

?Spring3.0引入了RestTemplate,WebClient是Spring Framework的一部分,但是在后來的官方源碼中介紹,RestTemplate有可能在未來的版本中被棄用,所謂替代RestTemplate,在Spring5中引入了WebClient作為異步的非阻塞、響應式的HTTP客戶端。

依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

使用

public class TestWebClient {@Testpublic void doGet() {String userId = "郭郭";String url = "http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId={userId}";Mono<String> mono = WebClient//創建WebClient實例.create()//方法調用,WebClient中提供了多種方法.get()//請求url.uri(url, userId)//獲取響應結果.retrieve()//將結果轉換為指定類型.bodyToMono(String.class);//返回最終結果:block是阻塞的/subscribe()非阻塞式獲取響應結果System.out.println("響應結果:" + mono.block());}@Testpublic void doPost() {Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);String url = "http://127.0.0.1:8094/masterdata/sysUser/saveUser";Mono<String> mono = WebClient//創建WebClient實例.create()//方法調用,WebClient中提供了多種方法.post()//請求url.uri(url)//指定請求的Content-Type為JSON.contentType(MediaType.APPLICATION_JSON)//使用bodyValue方法傳遞請求體.bodyValue(requestBody)//獲取響應結果.retrieve()//將結果轉換為指定類型.bodyToMono(String.class);//返回最終結果:block是阻塞的/subscribe()非阻塞式獲取響應結果System.out.println("響應結果:" + mono.block());}
}

?在上述doPost請求中,我們的請求接口入參是一個Map,但是需要轉換為JSON格式傳遞,這是因為WebClient默認是使用JSON序列化的。

3.Apache HttpClient

引入依賴

 <!-- 此處使用的是 5.x 版本,可以根據自身情況引入版本 --><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.1.1</version></dependency>
//步驟一:方式1獲取默認配置的httpClient實例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 方式2根據系統配置創建 HttpClient
// CloseableHttpClient httpClient = HttpClients.createSystem();
// 在項目啟動時可以通過設置如下JVM啟動參數:
// http.agent 配置 userAgent
// http.keepAlive 配置 keepAlive 數據
// 方式3自定義創建全局配置
// CloseableHttpClient httpClient = HttpClients.custom()
// .setDefaultHeaders(Collections.emptyList()) // 設置默認請求頭
// .setDefaultRequestConfig(RequestConfig.DEFAULT) // 設置默認配置
// .build();// 設置默認請求頭
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON));
headers.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, x-gzip, deflate"));
headers.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive"));
httpClient .setDefaultHeaders(headers) 
//步驟二:創建HTTP請求
HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/masterdata/sysUser/getSysUserById?userId=張三");// 創建請求配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 設置連接超時時間
.setConnectTimeout(Timeout.of(3000, TimeUnit.MILLISECONDS))
// 設置響應超時時間
.setResponseTimeout(3000, TimeUnit.MILLISECONDS)
// 設置從連接池獲取鏈接的超時時間
.setConnectionRequestTimeout(3000, TimeUnit.MILLISECONDS)
.build();
// 設置請求參數
httpGet.setConfig(requestConfig);
// 添加 Content-Type 請求頭
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_FORM_URLENCODED);
// 添加 accept 請求頭
httpPost.addHeader(new BasicHeader(HttpHeaders.ACCEPT, "*/*"));
//步驟三:發送請求并獲取響應數據
CloseableHttpResponse response = httpClient.execute(httpGet);
// 獲取請求狀態
int code = response.getCode();
//步驟四:處理響應數據
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
//步驟五:關閉httpClient和response
response.close();
httpClient.close();

?通過 URIBuilder 構建請求路徑

// 構建請求路徑,及參數
URL url = new URL("http://localhost:10010/user/params");
URI uri = new URIBuilder()
.setScheme(url.getProtocol())
.setHost(url.getHost())
.setPort(url.getPort())
.setPath(url.getPath())
// 構建參數
.setParameters(
new BasicNameValuePair("name", "張三"),
new BasicNameValuePair("age", "20")
).build();
?
// 創建 GET 請求對象
HttpGet httpGet = new HttpGet(uri);
// 調用 HttpClient 的 execute 方法執行請求
CloseableHttpResponse response = httpClient.execute(httpGet);
// 獲取請求狀態
int code = response.getCode();
// 如果請求成功
if(code == HttpStatus.SC_OK){
http://LOGGER.info("響應結果為:{}", EntityUtils.toString(response.getEntity()));
}

發送 JSON 數據

HttpClient 中發送 JSON 數據可以使用 StringHttpEntity 類實現,如下所示:
// 請求參數
String url = "http://localhost:10010/user/body";
// 創建 GET 請求對象
HttpPost httpPost = new HttpPost(url);
// 構建對象
User user = new User();
user.setName("張三")
.setAge(20)
.setAddress(new Address()
.setCounty("中國")
.setCity("北京"))
.setAihao(Arrays.asList("跑步", "爬山", "看書"));
?
// 創建 字符串實體對象
HttpEntity httpEntity = new StringEntity(JSON.toJSONString(user));
httpPost.setEntity(httpEntity);
?
// 發送 POST 請求
httpClient.execute(httpPost);

模擬form表單數據?

// 修改 contentType
// 創建 ContentType 對象為 form 表單模式
ContentType contentType = ContentType.create("application/x-www-form-urlencoded", StandardCharsets.UTF_8);
// 添加到 HttpPost 頭中
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, contentType);
創建請求數據 HttpEntity
// 方式一、自己拼接請求數據,并且創建 StringEntity 對象
String query = "name="+ URLEncoder.encode("張三", "utf-8") +"&age=20";
HttpEntity httpEntity = new StringEntity(query);
?
// 方式二、通過UrlEncodedFormEntity 創建 HttpEntity
HttpEntity httpEntity = new UrlEncodedFormEntity(
Arrays.asList(new BasicNameValuePair("name", "張三"),
new BasicNameValuePair("age", "20")),
StandardCharsets.UTF_8
);
?
// 把 HttpEntity 設置到 HttpPost 中
httpPost.setEntity(httpEntity);

?上傳

 //要上傳的文件File file = new File("F:/20150703212056_Yxi4L.jpeg");?// 創建對象MultipartEntityBuilder builder = MultipartEntityBuilder.create();?// 添加二進制消息體builder.addBinaryBody("file", file);?// 也可以添加文本消息ContentType contentType = ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8);builder.addTextBody("name", "張三", contentType);?// 通過 MultipartEntityBuilder 構建消息體HttpEntity httpEntity = builder.build();HttpPost httpPost = new HttpPost("http://localhost:10010/user/upload");httpPost.setEntity(httpEntity);CloseableHttpResponse response = httpClient.execute(httpPost);// 獲取請求狀態int code = response.getCode();// 如果請求成功if(code == HttpStatus.SC_OK){LOGGER.info("響應結果為:{}", EntityUtils.toString(response.getEntity()));}

下載

 // 請求下載路徑HttpGet httpGet = new HttpGet("http://localhost:10010/user/downLoad");CloseableHttpResponse response = httpClient.execute(httpGet);?// 如果請求成功if (response.getCode() == HttpStatus.SC_OK){?// 獲取下載文件的文件名,此處的 File-Name 頭信息,需要在服務端進行自定義Header header = response.getFirstHeader("File-Name");String value = header.getValue();?// 讀取數據byte[] bytes = EntityUtils.toByteArray(response.getEntity());try (OutputStream outputStream = new FileOutputStream("F:/" + value);){outputStream.write(bytes);outputStream.flush();}}

響應處理

 // 轉換為字符串EntityUtils.toString(response.getEntity());?// 轉換為字節數組EntityUtils.toByteArray(response.getEntity());

?自定義響應對象

@Data@Accessors(chain = true)class  Response {// 響應狀態private int code;// 響應描述private String msg;// 響應體private String body;}?// 調用  execute 時自定義 響應處理類Response execute = httpClient.execute(httpGet, response -> {return new Response().setCode(response.getCode()).setMsg(response.getReasonPhrase()).setBody(EntityUtils.toString(response.getEntity(),                 StandardCharsets.UTF_8));});

?會話保持

// 創建 HttpClientContext對象HttpContext httpContext = new BasicHttpContext();httpContext.setAttribute("name", "zhangsan");HttpClientContext httpClientContext = HttpClientContext.adapt(httpContext);?// 登錄httpClient.execute(new HttpPost(""), httpClientContext);?// 獲取數據httpClient.execute(new HttpGet(""), httpClientContext);

4.?OkHttp

具有低內存占有和出色的性能

引入依賴

  <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.0.0</version></dependency>

5.?HttpURLConnection

Java 自帶的一個 HTTP 客戶端工具

示例:

 @Testpublic void doGet() throws IOException {String userId = "張三";  // 參數值userId = URLEncoder.encode(userId, "UTF-8"); // 對參數值進行URL編碼//步驟一:創建URL對象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=" + userId);//步驟二:打開連接 HttpURLConnection繼承自URLConnection,是它的一個子類,//而HttpURLConnection專門用于處理HTTP協議的連接,如果需要處理其他協議使用通用的URLConnection。HttpURLConnection conn = (HttpURLConnection) url.openConnection();//步驟三:設置請求方式conn.setRequestMethod("GET");//步驟四:讀取響應內容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} @Testpublic void doPost() throws IOException {//創建URL對象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//打開連接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//設置請求方式conn.setRequestMethod("POST");// 設置請求頭conn.setRequestProperty("Content-Type", "application/json");//啟用輸出流//告訴連接對象您將使用輸出流來發送數據,這樣它會準備好接受輸出流,并將數據發送到服務器。//這是發送POST請求體數據所必需的步驟。get沒有請求體不需要conn.setDoOutput(true);//設置請求體數據Map map = new HashMap<>();map.put("name", "張三");String requestBody = JSON.toJSONString(map);//發送請求體數據try (DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream())) {outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));}//讀取響應內容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} 

6.?FeignClient

引入依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在 spring boot 啟動類加上@EnableFeignClients注解

// name:指定Feign的名稱,如果使用了注冊中心,name屬性會作為微服務的名稱,用于服務發現
// url:Feign調用的跳轉路徑,可以在配置文件中設置,多用于代碼調試
@FeignClient(name = "masterdata",url = "${masterdata-service-url}")
public interface ISysUserClient {@GetMapping(value = "/masterdata/getSysUserById")public Map getSysUserById(@RequestParam("userId") String userId);
}

默認是連接超時10s,讀超時60s ,feign 集成了 ribbon 和 hystrix,feign 本身不帶超時限制,其超時是由 ribbon 和 hystrix 控制的。

## 方法一:設置在ribbon上
ribbon:OkToRetryOnAllOperations: false #對所有操作請求都進行重試,默認falseReadTimeout: 5000   #負載均衡超時時間,默認值5000ConnectTimeout: 3000 #ribbon請求連接的超時時間,默認值2000MaxAutoRetries: 0     #對當前實例的重試次數,默認0MaxAutoRetriesNextServer: 1 #對切換實例的重試次數,默認1## 方法二:設置在feign client上
feign:client:config:default:connectTimeout: 5000readTimeout: 3000

7.?AsyncHttpClient

AsyncHttpClient是一個獨立的開源庫,它不依賴于任何的框架或者技術棧

依賴:

<dependency><groupId>org.asynchttpclient</groupId><artifactId>async-http-client</artifactId><version>2.12.3</version>
</dependency>

示例:

public class TestAsyncHttpClient {@Testpublic void doGet() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.prepareGet("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=郭郭");CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待響應完成String responseBody = future.join();System.out.println(responseBody);}}@Testpublic void doPost() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.preparePost("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//requestBody請求入參Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);requestBuilder.addHeader("Content-Type", "application/json");requestBuilder.setBody(requestBody);CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待響應完成String responseBody = future.join();System.out.println(responseBody);}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git拉取遠程倉庫代碼覆蓋本地,也就是放棄本地修改

git撤銷本地 、強制拉取遠程代碼覆蓋本地-CSDN博客 說的最多的是用&#xff1a;git fetch --all 但是親測是無效的&#xff0c;并不能將本地不存在但遠程倉庫存在的文件取回來。就是git fetch 項目地址&#xff0c;也是沒用的&#xff01; 就算是重新pull整個項目&#xff0…

Django中間件

目錄 一.介紹 1.什么是Django中間件 2.作用&#xff1a; 3.示例 二.Django請求生命周期流程圖 三.Django中間件是Django的門戶 四.中間件方法 1.必須掌握的中間件方法 &#xff08;1&#xff09;process_request: 示例&#xff1a; 2.需要了解的中間件方法 &#x…

新生兒散光:原因、科普和注意事項

引言&#xff1a; 散光是一種常見的眼睛問題&#xff0c;雖然在新生兒時期相對較少見&#xff0c;但了解其原因、科普相關知識&#xff0c;并提供一些建議的注意事項&#xff0c;對于嬰兒的視力健康至關重要。本文將深入探討新生兒散光的原因、相關科普知識&#xff0c;并為父…

大廠前沿技術導航

百度Geek說 - 知乎 騰訊技術 - 知乎 美團技術團隊

YaRN方法:無需微調,高效擴展語言模型上下文窗口/螞蟻集團與浙大發布原生安全框架v1.0,引領企業網絡安全新時代 |魔法半周報

我有魔法?為你劈開信息大海? 高效獲取AIGC的熱門事件&#x1f525;&#xff0c;更新AIGC的最新動態&#xff0c;生成相應的魔法簡報&#xff0c;節省閱讀時間&#x1f47b; &#x1f525;資訊預覽 YaRN方法&#xff1a;無需微調&#xff0c;高效擴展語言模型上下文窗口 螞蟻…

2023 hnust 湖南科技大學 信息安全管理課程 期中考試 復習資料

前言 ※老師沒畫重點的補充內容★往年試卷中多次出現或老師提過的&#xff0c;很可能考該筆記是奔著及格線去的&#xff0c;不是奔著90由于沒有聽過課&#xff0c;部分知識點不一定全&#xff0c;答案不一定完全正確 題型 試卷有很多題是原題 判斷題&#xff08;PPT&#xff…

python-冒泡排序

冒泡排序 &#xff08;穩定&#xff09; O(n^2) (穩定&#xff1a;表示相等的數&#xff0c;相對位置會不會改變) 冒泡排序&#xff08;Bubble Sort&#xff09;是一種簡單的排序算法&#xff0c;它通過多次遍歷待排序的元素&#xff0c;比較相鄰兩個元素的大小并交換它們&…

Kafka 常用功能總結(不斷更新中....)

kafka 用途 業務中我們經常用來兩個方面 1.發送消息 2.發送日志記錄 kafka 結構組成 broker&#xff1a;可以理解成一個單獨的服務器&#xff0c;所有的東西都歸屬到broker中 partation&#xff1a;為了增加并發度而做的拆分&#xff0c;相當于把broker拆分成不同的小塊&…

黨建信息管理系統源碼 支持在線交黨費 附帶完整的搭建教程

傳統的黨建管理模式通常采用手工方式&#xff0c;不僅效率低下&#xff0c;而且容易出錯。隨著組織規模的擴大和黨員數量的增加&#xff0c;這種管理方式已經無法滿足現實需求。此外&#xff0c;傳統的黨建管理模式缺乏在線交黨費功能&#xff0c;給黨員帶來不便。因此&#xf…

Kubernetes 離線部署 Spinnaker

離線部署 Spinnaker 離線部署 spinnaker 需要提前準備以下依賴項 halyard 安裝工具&#xff1a;該hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于國外halyard boms物料清單&#xff1a;Spinnaker 將其halyard boms配置存儲在公共谷歌云存儲 ( g…

Divisibility Trick

Dmitry最近學會了一個簡單的規則來檢查一個整數是否可以被3整除。如果一個整數的位數之和可以被3整除&#xff0c;那么它就可以被3所整除。 后來他還了解到&#xff0c;同樣的規則也可以用來檢查一個整數是否可以被9整除。如果一個整數的位數之和可以被9整除&#xff0c;那么它…

如何在 Web 應用程序中查找端點?

如何在 Web 應用程序中查找端點? 這篇文章主要講述了如何在網絡應用中找到端點。以下是文章的主要要點: 端點是網絡服務的訪問地址,通過引用這個URL,客戶可以訪問服務提供的操作。端點提供了尋址Web服務端點所需的信息。 HTTP消息是服務器和客戶端之間交換數據的方式,包…

Anaconda深度學習環境配置命令參考

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 Anaconda深度學習環境配置 Anaconda 管理1. 檢查 Anaconda 版本2. 獲取版本號3. 列出所有的虛擬環境4. 查看環境管理的全部命令幫助5. conda升級6. conda升級后釋放空間 Anac…

2024免費MacBook清理工具CleanMyMac X4.15

CleanMyMac X 是一款專業的Mac清理軟件&#xff0c;可智能清理mac磁盤垃圾和多余語言安裝包&#xff0c;快速釋放電腦內存&#xff0c;輕松管理和升級 Mac 上的應用。同時 CleanMyMac X 可以強力卸載惡意軟件&#xff0c;修復系統漏洞&#xff0c;一鍵掃描和優化 Mac 系統&…

競賽知識點12【樹狀數組】

文章目錄 1、思路引入2、求lowbit(n)3、對某個元素進行加法操作(單點更新)4、查詢前綴和5、統計A[x]~A[y] 的值1、思路引入 如果線段樹每個節點維護的是對應區間的和,比如說計算從 s s s 到 t t t 的和 ( a s + … + a t ) (a_s+…+a_t) (as?+…+at?),在基于線段樹的實…

【ChatGLM3-6B】Docker下部署及微調

【ChatGLM2-6B】小白入門及Docker下部署 注意&#xff1a;Docker基于鏡像中網盤上上傳的有已經做好的鏡像&#xff0c;想要便捷使用的可以直接從Docker基于鏡像安裝看Docker從0安裝前提下載啟動訪問 Docker基于鏡像安裝容器打包操作&#xff08;生成鏡像時使用的命令&#xff0…

Nginx常用負載均衡策略

Nginx常用負載均衡策略 輪詢&#xff08;默認&#xff09; 注意&#xff1a;這里的輪詢并不是每個請求輪流分配到不同的后端服務器&#xff0c;與ip_hash類似&#xff0c;但是按照訪問url的hash結果來分配請求&#xff0c;使得每個url定向到同一個后端服務器&#xff0c;主要…

什么手機30萬?VERTU唐卡手機頂配56.8萬

近日,一則新聞在社交媒體上引發了廣泛關注。一名男子遺失了一部價值30萬的VERTU唐卡定制款手機,而一位女士在撿到這部手機后,誤以為是一部普通的老年機,引發了種種誤會。30萬的手機是什么牌子?VERTU唐卡手機浮出水面 據了解,這部VERTU唐卡定制款手機是一款豪華的奢侈品定制手機…

2-Python與設計模式--前言

0-Python與設計模式–前言 一 什么是設計模式 設計模式是面對各種問題進行提煉和抽象而形成的解決方案。這些設計方案是前人不斷試驗&#xff0c; 考慮了封裝性、復用性、效率、可修改、可移植等各種因素的高度總結。它不限于一種特定的語言&#xff0c; 它是一種解決問題的思…

GoogleNet詳解

一、亮點 AlexNet、VGG都只有一個輸出層。googlenet有三個&#xff08;其中兩個是輔助分類層&#xff09; 二、先看看Inception結構 1、Inception 之前的網絡&#xff1a; AlexNet、VGG都是串行結構 Inception&#xff1a; 并行結構 上一層的輸出同時傳入四個并行結構&…