網站首頁 編程語言 正文
文章目錄
- 前言
- 一、第三方API
- 二、Apache HttpClient
- 1.HttpClient
- 2.使用步驟
- 三、Spring RestTemplate
- 1.RestTemplate
- 2.使用步驟
- getForObject方法
- exchange方法
- 項目中的實際應用
- 總結
前言
在實際開發中,免不了要使用Http請求,去調用第三方服務,最近項目中就使用到了這方面的技術。下邊記錄一下怎么在項目中發送Http請求去調用第三方API
一、第三方API
在實際開發中,我們免不了去調用第三方的API去完成開發。什么是第三方API?
在 Java 開發中,第三方 API 指的是由其他公司或組織開發的、可供我們在自己的應用程序中調用的接口。這些接口通常提供一些特定的功能或服務,如支付、地圖、天氣、替換詞庫等等。
使用第三方 API 可以讓我們快速搭建起自己的應用程序而不需要從頭開始自己開發這些功能,同時也可以提高程序的可靠性和安全性。這是因為我們可以信任這些獨立的第三方公司或組織能夠提供高質量穩定的 API 服務。
在 Java 中,我們可以通過發送 HTTP 請求來調用第三方 API,這樣就能夠獲取到 API 返回的各種數據。使用一些比較成熟的 HTTP 客戶端框架,比如 Spring RestTemplate和 Apache HttpClient,能夠讓我們更容易地發送 HTTP 請求,并處理返回的數據。
二、Apache HttpClient
1.HttpClient
什么是HttpClient?
HttpClient 是Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,并且它支持 HTTP 協議最新的版本和建議。
HttpClient的主要功能
-
實現了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
-
支持 HTTPS 協議
-
支持代理服務器(Nginx等)等
-
支持自動(跳轉)轉向
2.使用步驟
導入依賴
<!--HttpClient依賴-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
編寫請求
Get方式
/**
* 以get方式調用第三方接口
* @param url
* @return
*/
public static String doGet(String url, String token){
//創建HttpClient對象
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet get = new HttpGet(url);
try {
if (token != null && !token.equals("")){
token = getToken();
}
//自定義header頭,用于token驗證使用
get.addHeader("XXXXXXXX", token);
//定義請求內容格式
get.addHeader("Content-Type", "application/json;charset=utf8");
//發送請求
HttpResponse response = httpClient.execute(get);
//判斷是否成功
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//返回json格式
String res = EntityUtils.toString(response.getEntity());
return res;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Post方式
/**
* 以post方式調用第三方接口
* @param url
* @param json
* @return
*/
public static String doPost(String url, JSONObject json){
try {
if (httpClient == null){
httpClient = HttpClientBuilder.create().build();
}
HttpPost post = new HttpPost(url);
if (token != null && !token.equals("")){
token = getToken();
}
//自定義header頭,用于token驗證使用
post.addHeader("XXXXXXXX", tokenString);
post.addHeader("Content-Type", "application/json;charset=utf8");
StringEntity s = new StringEntity(json.toString());
s.setContentEncoding("UTF-8");
//發送json數據需要設置contentType
s.setContentType("application/x-www-form-urlencoded");
//設置請求參數
post.setEntity(s);
HttpResponse response = httpClient.execute(post);
//是否請求成功
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//返回json格式
String res = EntityUtils.toString(response.getEntity());
return res;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (httpClient != null){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
三、Spring RestTemplate
1.RestTemplate
相比于HttpClient來說,RestTemplate的優勢在于可以完美匹配Spring框架,如果使用的是Spring框架,那么用它是非常合適的。
Spring RestTemplate 是 Spring 提供的用于發送 HTTP 請求的一個模板類,它簡化了 HTTP 交互的過程,提供了更高層次的 API 以便更方便地使用。通過 RestTemplate,我們可以發送諸如 GET、POST、DELETE、PUT 等多種類型的請求,并能很方便地處理響應數據,例如將僅有的 JSON 響應轉換成Java對象。
RestTemplate支持同步和異步操作,同時也支持 SSL 安全連接,能夠對于 HTTP 請求和響應進行自定義的攔截器, 更加高級的特性則支持客戶端負載均衡、circuit breaker 等。
在使用 RestTemplate 時,我們可以選擇使用包含在 Spring Boot 中的模板,并在代碼中直接注入自動配置的 RestTemplate。我們還可以根據接口的需求自由組合 RestTemplate 的各種特性,開發出性能更好的 HTTP 客戶端。Spring RestTemplate 的使用非常廣泛,特別是在與 RESTful Web 服務進行交互時。
2.使用步驟
添加依賴
使用 RestTemplate 時,我們也需要添加一些第三方庫的依賴,例如 Spring 的 Web 和 Apache 的 HttpClient:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
Spring Boot 已經為我們自動配置了 RestTemplate 實例。我們可以直接在代碼中引入 RestTemplate 實例,然后使用它去發送 HTTP 請求
getForObject方法
這里我們可以直接通過 getForObject()
方法去發送我們想要發送的請求
例如:
@RestController
@RequestMapping("/api")
public class ApiController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/users/{userId}")
public User getUserById(@PathVariable Long userId) {
String url = "https://api.example.com/users/" + userId;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
在這個例子中,我們使用 RestTemplate 發送了一個 GET 請求,獲取了用戶 ID 為 userId 的用戶信息,并將響應體轉換成了一個 User 對象。需要注意的是,在上面的例子中,我們注入了 RestTemplate 實例,所以我們不需要再手動創建 RestTemplate 對象。如果需要自定義 RestTemplate 的更多特性,我們可以在配置文件中進行相關配置。
Spring支持以Bean的形式去配置RestTemplate
@Configuration
public class RestTemplateConfguration {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// 配置
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
return restTemplate;
}
}
在這個例子中,我們通過 @Configuration 注解創建了一個 RestTemplate 的 Bean,通過該 Bean 的方式來使用 RestTemplate 對象,并對其進行了一些配置,例如為其添加字符集編碼為 UTF-8 的轉換器以及設置默認錯誤處理程序。
exchange方法
RestTemplate 的 exchange()
方法與 getForObject()
、 postForObject()
等方法類似,也是用來發送 HTTP 請求的。
不同的是,exchange方法返回的是 ResponseEntity 對象,這個對象包含了一個泛型類型的 body 屬性和其他 HTTP 實體信息,如響應頭、狀態碼等。
使用 exchange 方法發送請求的示例代碼:
@GetMapping("/get")
public ResponseEntity<String> getWithExchange() {
String url = "http://XXXXXXXXXX.com/get";
HttpHeaders headers = new HttpHeaders();
headers.set("User-Agent", "Mozilla/5.0");
HttpEntity<String> entity = new HttpEntity<>(null, headers);
return restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
}
在這個例子中,我們使用 RestTemplate.exchange()
方法發送一個 GET 請求,發送的 URL 是 “http://XXXXXX.com/get”,請求頭中添加了 “User-Agent”,主體部分設置為 null,響應體為字符串。exchange 方法的第一個參數是請求的地址,第二個參數是請求的方法,第三個參數是用于發送請求的 HttpEntity 對象,第四個參數是期望接收的響應體類型。
需要注意的是,exchange 方法需要我們手動構建一個 HttpEntity 對象并將其作為請求的主體部分。在這個例子中,我們構建了一個 HttpEntity 對象,并將其主體部分設置為 null
,這意味著這個請求不包含主體部分。此外,headers 也是構建 HttpEntity 對象時需要傳入的,用于設置請求頭。
項目中的實際應用
HttpHeaders headers = new HttpHeaders();
headers.set("第三方接口的請求頭", authConfig.getHsbcFacadeServiceId());
headers.set("第三方接口的請求頭", authConfig.getHsbcFacadeServiceSecret());
HttpEntity entity = new HttpEntity<>(headers);
ResponseEntity<String> exchange = restTemplate.exchange(thirdConfig.getUserInfoUrl() + "?phone=" + empActivity.getPhone(), HttpMethod.GET, entity, String.class);
JSONObject body = JSON.parseObject(exchange.getBody());
if (ThirdSuccessEnum.RET_CODE_SUCCESS.getCode().equals(Integer.parseInt(body.getString("retCode")))) {
JSONObject data = JSON.parseObject(body.getString("data"));
ActivityRecord activityRecord = new ActivityRecord();
activityRecord.setMemberId(String.valueOf(data.getString("userId")));
activityRecord.setType(Integer.parseInt(empActivity.getType()));
activityRecord.setEmpId(String.valueOf(empActivity.getActivityId()));
activityRecord.setAppointmentStatus(empActivity.getAppointmentStatus());
saveRecords(activityRecord, empVo);
}
總結
在項目中調用第三方API是很常用的,尤其是,多個開發小組協同開發的時候,免不了要調用別的項目組給出的服務,本次也是淺淺的記錄一下。推薦使用restTemplate.exchange()
方法。
原文鏈接:https://blog.csdn.net/l_zl2021/article/details/131243720
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-10 table列表中輸入框input與文本span切換的實現
- 2022-10-11 delphi fmx android 屏幕分辨率
- 2022-04-11 C++中引用和const關鍵字介紹_C 語言
- 2022-04-19 IDEA 快捷生成注釋 配置(完美不報警告)
- 2022-05-26 基于Python實現將列表數據生成折線圖_python
- 2022-10-01 Docker部署單頁應用的詳細操作_docker
- 2023-12-21 JDBC中ResultSet的使用
- 2022-11-26 Mongodb?如何將時間戳轉換為年月日日期_MongoDB
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支