使用Http请求调用第三方API

文章目录

  • 前言
  • 一、第三方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 RestTemplateApache 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.使用步骤

导入依赖

        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
            <version>4.5.5version>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.47version>
        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.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
    <groupId>org.apache.httpcomponentsgroupId>
    <artifactId>httpclientartifactId>
    <version>4.5.5version>
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()方法。

你可能感兴趣的:(业务场景,http,java,第三方API,HttpClient,RestTemplate)