java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot调用外部接口

Spring Boot中调用外部接口的3种方式步骤

作者:Wen先森

这篇文章主要给大家介绍了关于Spring Boot中调用外部接口的3种方式步骤,在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求,需要的朋友可以参考下

简介

SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求。

调用外部接口是指在应用程序中与其他系统、服务或服务端点进行通信,以获取数据或执行某些操作。这种通信可以通过 HTTP、HTTPS、SOAP、gRPC 等协议来实现。

调用外部接口通常涉及以下几个步骤:

在调用外部接口时,还需要注意以下事项:

总之,调用外部接口是实现应用程序与其他系统集成的重要方式,它能够使你的应用程序获取到外部数据,实现复杂的业务逻辑,并与其他系统进行交互。选择合适的调用方式和合理处理错误情况,能够保证接口调用的可靠性和性能。

方案一:采用原生的httpClient请求

/**
 1. 跨域请求工具类
 */
public class HttpClientUtils {
    public static String doGet(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();
            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);
            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
    public static String doGet(String url) {
        return doGet(url, null);
    }
    public static String doPost(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建参数列表
            if (param != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (String key : param.keySet()) {
                    paramList.add(new BasicNameValuePair(key, param.get(key)));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
    public static String doPost(String url) {
        return doPost(url, null);
    }
    public static String doPostJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
}

方案二:采用原生的RestTemplate方法

  RestTemplate 是 Spring 框架提供的用于访问 RESTful 服务的客户端工具类。它封装了常见的 HTTP 请求操作,提供了简单易用的 API,这里主要介绍Get和Post方法的使用。

Get请求

  在 RestTemplate 中,getForEntity 方法有多个重载形式,可以根据需要选择合适的方法进行 GET 请求。提供了getForObject 、getForEntity两种方式。

getForEntity

以下是 getForEntity 方法的三种形式:

 1. getForEntity(String url, Class<T> responseType, Object... uriVariables);
 2. getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables);
 3. getForEntity(URI url, Class<T> responseType);

以下是对每个方法的说明和示例:

或者

RestTemplate restTemplate=new RestTemplate();
UriComponents uriComponents=UriComponentsBuilder.fromUriString("http://example.com/api/users/{id}")
    .build()
    .expand(1)
    .encode();
URI uri=uriComponents.toUri();
ResponseEntity<User> response = restTemplate.getForEntity(uri, User.class);
User user = response.getBody();

getForObject

以下是 getForEntity 方法的三种形式:

 1. getForObject(String url, Class<T> responseType, Object... uriVariables);
 2. getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables);
 3. getForObject(URI url, Class<T> responseType);

这段代码是 RestTemplate 类中的 getForObject 方法的重写实现。它用于发送 GET 请求,并返回一个指定类型的对象,而不是完整的响应实体。

以下是对每个方法的说明和示例:

getForEntity和getForObject的联系

getForObject 和 getForEntity 是 RestTemplate 类中用于发送 GET 请求并获取响应的两个方法。它们在功能上有一些相似之处,但也有一些区别。

相同点:

区别:

选择使用哪个方法取决于你对响应的需求:

示例:

RestTemplate restTemplate = new RestTemplate();
// 使用 getForObject 方法
User user1 = restTemplate.getForObject("http://example.com/api/users/1", User.class);
// 使用 getForEntity 方法
ResponseEntity<User> responseEntity = restTemplate.getForEntity("http://example.com/api/users/1", User.class);
User user2 = responseEntity.getBody();
HttpStatus statusCode = responseEntity.getStatusCode();
HttpHeaders headers = responseEntity.getHeaders();

总之,getForObject 和 getForEntity 都是用于发送 GET 请求并获取响应的方法,选择使用哪个方法取决于你对响应的需求。

Post请求

Post请求提供有postForEntitypostForObjectpostForLocation三种方式,其中每种方式都有三种方法,下面介绍postForEntity的使用方法。

postForEntity

以下是 postForEntity 方法的三种形式:

 1. postForEntity(String url, @Nullable Object request,Class<T> responseType, Object... uriVariables);
 2. postForEntity(String url, @Nullable Object request,Class<T> responseType, Map<String, ?> uriVariables);
 3. postForEntity(URI url, @Nullable Object request, Class<T> responseType);

这段代码是 RestTemplate 类中的 postForEntity 方法的重写实现。它用于发送 POST 请求,并返回一个包含完整响应信息的 ResponseEntity 对象,而不仅仅是响应体内容。

下面是对每个重写方法的详细说明和示例:

request 和 uriVariables 是用于构造 POST 请求的两个不同的参数,它们在不同的作用域中起作用。

request 参数:

  • request 参数表示发送 POST 请求时的请求体内容。
  • 它可以是任意类型的对象,根据实际的请求需求来决定具体的类型。通常情况下,request 参数会作为请求体的内容进行发送。
  • 如果你的 POST 请求不需要请求体,可以将 request 参数设置为 null

uriVariables 参数:

  • uriVariables 参数表示可选的路径参数,用于替换 URL 中的占位符。
  • 它是一个可变参数,可以传递多个参数值。参数值的顺序必须与 URL 中占位符的顺序一致。
  • 在发送 POST 请求时,将路径参数与 URL 进行替换,以获得最终的请求 URL。

综上所述,request 和 uriVariables 是两个用于构建 POST
请求不同参数,分别代表请求体的内容和路径参数。需要根据具体的需求来使用它们。如果需要发送请求体,将内容放在 request参数中;如果需要替换 URL 中的占位符,将参数值传递给 uriVariables 参数。

postForObject

以下是 postForObject 方法的三种形式:

 1. postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables);
 2. postForObject(String url, @Nullable Object request, Class<T> responseType,Map<String, ?> uriVariables);
 3. postForObject(URI url, @Nullable Object request, Class<T> responseType);

这是 RestTemplate 类中关于 POST 请求的三个 postForObject 方法的实现。下面将详细解释每个方法及其示例用法:

postForLocation

以下是 postForLocation 方法的三种形式:

 1. postForLocation(String url, @Nullable Object request, Object... uriVariables);
 2. postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables);
 3. postForLocation(URI url, @Nullable Object request);

这是 RestTemplate 类中关于 POST 请求并获取 Location 头部信息的三个 postForLocation 方法的实现。下面将详细解释每个方法及其示例用法:

postForEntity、postForObject和postForLocation的联系

postForEntitypostForObject 和 postForLocation 都是 RestTemplate 类中用于发送 POST 请求的方法,它们之间存在一些联系和区别。

联系:

区别:

总结:
这三个方法都用于发送 POST 请求,根据需要返回不同的信息。如果需要完整的响应信息,包括响应状态码、头部信息和响应体,可以使用 postForEntity;如果只需要响应体内容,可以使用 postForObject;如果仅关注响应头部中的 Location 信息,可以使用 postForLocation

方案三:使用Feign进行消费

Feign 是一个声明式的、基于接口的 HTTP 客户端,它简化了使用 Spring Cloud 进行远程服务调用的过程。通过 Feign,可以以声明式的方式定义和调用远程服务接口,而无需手动编写实现代码。

在使用 Feign 进行消费时,需要完成以下几个步骤:

Feign 的工作原理如下:

Feign 还具备以下特性:

总而言之,Feign 提供了一种简单且优雅的方式来定义和调用远程服务接口,它屏蔽了底层的 HTTP 请求细节,使得远程服务调用更加便捷和灵活。同时,通过与 Spring Cloud 的集成,Feign 还可以享受到负载均衡、服务发现等分布式系统支持。

具体实现

使用 Feign 进行消费时,需要进行以下步骤:

以上是使用 Feign 进行消费的基本步骤。Feign 可以根据接口定义自动生成符合服务提供方 API 规范的客户端实现,并且内部集成了负载均衡和服务发现等功能,简化了远程服务调用的过程。

添加Header解决方法

在使用 Feign 进行远程服务调用时,可以通过添加 Header 来传递额外的请求信息。下面介绍两种常见的方式来添加 Header。

Spring Boot 调用外部接口的三种方式的联系

Spring Boot 调用外部接口的方式有多种,常见的有以下三种方式:RestTemplate、Feign 和 WebClient。它们之间存在一些联系和区别。

这三种方式在实际使用中有一些联系和区别:

选择使用哪种方式需要根据具体的需求和场景来决定。在 Spring Boot 中,可以根据项目的特点和要求,灵活选择适合的方式进行外部接口调用。

总结

到此这篇关于Spring Boot中调用外部接口的3种方式步骤的文章就介绍到这了,更多相关Spring Boot调用外部接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文