網(wǎng)站首頁 編程語言 正文
文章目錄
- 前言
- 一、第三方API
- 二、Apache HttpClient
- 1.HttpClient
- 2.使用步驟
- 三、Spring RestTemplate
- 1.RestTemplate
- 2.使用步驟
- getForObject方法
- exchange方法
- 項(xiàng)目中的實(shí)際應(yīng)用
- 總結(jié)
前言
在實(shí)際開發(fā)中,免不了要使用Http請(qǐng)求,去調(diào)用第三方服務(wù),最近項(xiàng)目中就使用到了這方面的技術(shù)。下邊記錄一下怎么在項(xiàng)目中發(fā)送Http請(qǐng)求去調(diào)用第三方API
一、第三方API
在實(shí)際開發(fā)中,我們免不了去調(diào)用第三方的API去完成開發(fā)。什么是第三方API?
在 Java 開發(fā)中,第三方 API 指的是由其他公司或組織開發(fā)的、可供我們?cè)谧约旱膽?yīng)用程序中調(diào)用的接口。這些接口通常提供一些特定的功能或服務(wù),如支付、地圖、天氣、替換詞庫(kù)等等。
使用第三方 API 可以讓我們快速搭建起自己的應(yīng)用程序而不需要從頭開始自己開發(fā)這些功能,同時(shí)也可以提高程序的可靠性和安全性。這是因?yàn)槲覀兛梢孕湃芜@些獨(dú)立的第三方公司或組織能夠提供高質(zhì)量穩(wěn)定的 API 服務(wù)。
在 Java 中,我們可以通過發(fā)送 HTTP 請(qǐng)求來調(diào)用第三方 API,這樣就能夠獲取到 API 返回的各種數(shù)據(jù)。使用一些比較成熟的 HTTP 客戶端框架,比如 Spring RestTemplate和 Apache HttpClient,能夠讓我們更容易地發(fā)送 HTTP 請(qǐng)求,并處理返回的數(shù)據(jù)。
二、Apache HttpClient
1.HttpClient
什么是HttpClient?
HttpClient 是Apache Jakarta Common 下的子項(xiàng)目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。
HttpClient的主要功能
-
實(shí)現(xiàn)了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
-
支持 HTTPS 協(xié)議
-
支持代理服務(wù)器(Nginx等)等
-
支持自動(dòng)(跳轉(zhuǎn))轉(zhuǎn)向
2.使用步驟
導(dǎo)入依賴
<!--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>
編寫請(qǐng)求
Get方式
/**
* 以get方式調(diào)用第三方接口
* @param url
* @return
*/
public static String doGet(String url, String token){
//創(chuàng)建HttpClient對(duì)象
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet get = new HttpGet(url);
try {
if (token != null && !token.equals("")){
token = getToken();
}
//自定義header頭,用于token驗(yàn)證使用
get.addHeader("XXXXXXXX", token);
//定義請(qǐng)求內(nèi)容格式
get.addHeader("Content-Type", "application/json;charset=utf8");
//發(fā)送請(qǐng)求
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方式調(diào)用第三方接口
* @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驗(yàn)證使用
post.addHeader("XXXXXXXX", tokenString);
post.addHeader("Content-Type", "application/json;charset=utf8");
StringEntity s = new StringEntity(json.toString());
s.setContentEncoding("UTF-8");
//發(fā)送json數(shù)據(jù)需要設(shè)置contentType
s.setContentType("application/x-www-form-urlencoded");
//設(shè)置請(qǐng)求參數(shù)
post.setEntity(s);
HttpResponse response = httpClient.execute(post);
//是否請(qǐng)求成功
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的優(yōu)勢(shì)在于可以完美匹配Spring框架,如果使用的是Spring框架,那么用它是非常合適的。
Spring RestTemplate 是 Spring 提供的用于發(fā)送 HTTP 請(qǐng)求的一個(gè)模板類,它簡(jiǎn)化了 HTTP 交互的過程,提供了更高層次的 API 以便更方便地使用。通過 RestTemplate,我們可以發(fā)送諸如 GET、POST、DELETE、PUT 等多種類型的請(qǐng)求,并能很方便地處理響應(yīng)數(shù)據(jù),例如將僅有的 JSON 響應(yīng)轉(zhuǎn)換成Java對(duì)象。
RestTemplate支持同步和異步操作,同時(shí)也支持 SSL 安全連接,能夠?qū)τ?HTTP 請(qǐng)求和響應(yīng)進(jìn)行自定義的攔截器, 更加高級(jí)的特性則支持客戶端負(fù)載均衡、circuit breaker 等。
在使用 RestTemplate 時(shí),我們可以選擇使用包含在 Spring Boot 中的模板,并在代碼中直接注入自動(dòng)配置的 RestTemplate。我們還可以根據(jù)接口的需求自由組合 RestTemplate 的各種特性,開發(fā)出性能更好的 HTTP 客戶端。Spring RestTemplate 的使用非常廣泛,特別是在與 RESTful Web 服務(wù)進(jìn)行交互時(shí)。
2.使用步驟
添加依賴
使用 RestTemplate 時(shí),我們也需要添加一些第三方庫(kù)的依賴,例如 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 已經(jīng)為我們自動(dòng)配置了 RestTemplate 實(shí)例。我們可以直接在代碼中引入 RestTemplate 實(shí)例,然后使用它去發(fā)送 HTTP 請(qǐng)求
getForObject方法
這里我們可以直接通過 getForObject()
方法去發(fā)送我們想要發(fā)送的請(qǐng)求
例如:
@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;
}
}
在這個(gè)例子中,我們使用 RestTemplate 發(fā)送了一個(gè) GET 請(qǐng)求,獲取了用戶 ID 為 userId 的用戶信息,并將響應(yīng)體轉(zhuǎn)換成了一個(gè) User 對(duì)象。需要注意的是,在上面的例子中,我們注入了 RestTemplate 實(shí)例,所以我們不需要再手動(dòng)創(chuàng)建 RestTemplate 對(duì)象。如果需要自定義 RestTemplate 的更多特性,我們可以在配置文件中進(jìn)行相關(guān)配置。
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;
}
}
在這個(gè)例子中,我們通過 @Configuration 注解創(chuàng)建了一個(gè) RestTemplate 的 Bean,通過該 Bean 的方式來使用 RestTemplate 對(duì)象,并對(duì)其進(jìn)行了一些配置,例如為其添加字符集編碼為 UTF-8 的轉(zhuǎn)換器以及設(shè)置默認(rèn)錯(cuò)誤處理程序。
exchange方法
RestTemplate 的 exchange()
方法與 getForObject()
、 postForObject()
等方法類似,也是用來發(fā)送 HTTP 請(qǐng)求的。
不同的是,exchange方法返回的是 ResponseEntity 對(duì)象,這個(gè)對(duì)象包含了一個(gè)泛型類型的 body 屬性和其他 HTTP 實(shí)體信息,如響應(yīng)頭、狀態(tài)碼等。
使用 exchange 方法發(fā)送請(qǐng)求的示例代碼:
@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);
}
在這個(gè)例子中,我們使用 RestTemplate.exchange()
方法發(fā)送一個(gè) GET 請(qǐng)求,發(fā)送的 URL 是 “http://XXXXXX.com/get”,請(qǐng)求頭中添加了 “User-Agent”,主體部分設(shè)置為 null,響應(yīng)體為字符串。exchange 方法的第一個(gè)參數(shù)是請(qǐng)求的地址,第二個(gè)參數(shù)是請(qǐng)求的方法,第三個(gè)參數(shù)是用于發(fā)送請(qǐng)求的 HttpEntity 對(duì)象,第四個(gè)參數(shù)是期望接收的響應(yīng)體類型。
需要注意的是,exchange 方法需要我們手動(dòng)構(gòu)建一個(gè) HttpEntity 對(duì)象并將其作為請(qǐng)求的主體部分。在這個(gè)例子中,我們構(gòu)建了一個(gè) HttpEntity 對(duì)象,并將其主體部分設(shè)置為 null
,這意味著這個(gè)請(qǐng)求不包含主體部分。此外,headers 也是構(gòu)建 HttpEntity 對(duì)象時(shí)需要傳入的,用于設(shè)置請(qǐng)求頭。
項(xiàng)目中的實(shí)際應(yīng)用
HttpHeaders headers = new HttpHeaders();
headers.set("第三方接口的請(qǐng)求頭", authConfig.getHsbcFacadeServiceId());
headers.set("第三方接口的請(qǐng)求頭", 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);
}
總結(jié)
在項(xiàng)目中調(diào)用第三方API是很常用的,尤其是,多個(gè)開發(fā)小組協(xié)同開發(fā)的時(shí)候,免不了要調(diào)用別的項(xiàng)目組給出的服務(wù),本次也是淺淺的記錄一下。推薦使用restTemplate.exchange()
方法。
原文鏈接:https://blog.csdn.net/l_zl2021/article/details/131243720
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-11-10 Android光線傳感器使用方法詳解_Android
- 2023-01-17 Android資源文件與層次式導(dǎo)航超詳細(xì)講解_Android
- 2022-06-29 C語言超詳細(xì)講解指針的概念與使用_C 語言
- 2023-11-13 【云原生】docker設(shè)置非root用戶使用權(quán)限的方法
- 2021-12-15 Redis可視化工具Redis?Desktop?Manager的具體使用_Redis
- 2022-05-20 C#隊(duì)列的簡(jiǎn)單使用_C#教程
- 2022-12-07 C++中的數(shù)字轉(zhuǎn)字符串to_string_C 語言
- 2022-06-16 C語言深入分析遞歸函數(shù)的實(shí)現(xiàn)_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支