使用RestTemplate调用外部Http接口

本文详细介绍如何使用Spring的RestTemplate来调用外部HTTP接口,包括实体类与JSON字符串的转换、请求报文的构建及远程调用过程,同时解决常见错误并提供响应报文的获取方法。

使用RestTemplate调用外部Http接口

我们使用RestTemplate调用外部接口,restTemplate可以自动转换实体类和json字符串,这样便于我们调用接口。

通常我们得到一个外部接口,会告诉我们请求报文和响应报文。例如:

在这里插入图片描述
我们需要将其转化成对应的java类,如果不会转化,可以百度:json字符串在线转java类。
注意:java的类一定要与json字符串格式对应。如上,我们需要定义一个大类,其中包含两个类。并且这两个类的类名需要与message_header与message_content对应上,否则会提示报文格式不对。若自定义了类名,可以使用注解@JsonProperty。例如:

在这里插入图片描述
这样在转换时,就会自动将companyReqHeader转换为message_header,与json字符串对应上。
接下来,我们就需要给实体类创造对象并且赋值,对于类中类的赋值,我们需要先给里面的类赋值,再里面的类作为属性赋给外面的类。例如:
CompanyReqHeader companyReqHeader=new CompanyReqHeader();
companyReqHeader.setSyscode(“SAIC_TJ_0002”);
companyReqHeader.setAuthcode(“c4b051f692eb4d0bbf15d9d008a727c0”);
companyReqHeader.setBusinesstype(“005”);
companyReqHeader.setSign(“TJ”);
companyReqHeader.setVersion(“版本1”);
CompanyReqContent companyReqContent=new CompanyReqContent();
companyReqContent.setQrid(randomDto.getQrid());
companyReqContent.setRettype(“1”);
companyReqContent.setOpertime("");

	CompanyReq companyReq=new CompanyReq();
	companyReq.setCompanyReqHeader(companyReqHeader);
	companyReq.setCompanyReqContent(companyReqContent);

(CompanyReq类中包含了两个类,CompanyReqHeader和CompanyReqContent)

创建好请求报文后,我们就可以使用RestTemplate调用外部接口:

ResponseEntity responseEntity=restTemplate.postForEntity(“http://117.184.199.39:8089/authenticationService/httpserver.do”,companyReq,CompanyRsp.class);
其中CompanyRsp为返回的响应报文的实体类,restTemplate为RestTemplate的对象,postForEntity方法有三个参数,分别为:外部接口地址、请求体的对象、返回的实体类。
如果单单这样写,你发现会报错,这时需要加上:

restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());(写在调用接口前面)
注:WxMappingJackson2HttpMessageConverter是我们自己创建的,继承了MappingJackson2HttpMessageConverter。如:
public class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
public WxMappingJackson2HttpMessageConverter() {
List mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.TEXT_PLAIN);
mediaTypes.add(MediaType.TEXT_HTML); //加入text/html类型的支持
setSupportedMediaTypes(mediaTypes);// tag6
}
}
这样就完成了接口的调用,可以得到我们需要的响应报文。如果想获得响应的实体类:responseEntity.getBody();后端就获取到了调用接口返回的响应报文。
接下来,我们需要在前端展示出来:
因为后端和前端代码不在一个包里,所以我们需要远程调用,在前端这个包里获取到调用接口的响应报文,可以在controller层中写这个调用,但是这个调用函数需要用到随机码作为参数,而我的随机码是通过注解@RequestBody直接从页面获取的,但是@RequestBody和@GetMapping冲突,因此我们需要将random参数通过地址的形式传递过来,然后在展示页面的controller获取到,将其赋给类,再使用远程调用,就可以获取到响应报文了,接着用addObject()申明,就可以在前端${}使用变量值了,进行展示。

在Spring Boot中使用`RestTemplate`调用外部接口是一种常见且高效的实践方式。通过`RestTemplate`,可以轻松地发送HTTP请求并处理响应,支持GET、POST、PUT、DELETE等常见HTTP方法。以下是具体的实现步骤和示例代码。 ### 配置RestTemplate Bean 首先,需要将`RestTemplate`配置为Spring容器中的Bean,以便在整个应用中方便地使用。可以通过配置类来定义该Bean: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ``` ### 发起GET请求 在实际开发中,GET请求通常用于获取外部服务的数据。以下是一个使用`RestTemplate`发起GET请求的示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ExternalService { @Autowired private RestTemplate restTemplate; public String callExternalApi() { String url = "https://api.example.com/data"; return restTemplate.getForObject(url, String.class); } } ``` 上述代码中,`getForObject`方法用于发送GET请求,并将响应体直接转换为指定的类型(如`String`)。 ### 发起POST请求 POST请求通常用于向外部服务提交数据。以下是一个使用`RestTemplate`发起POST请求的示例: ```java import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ExternalService { @Autowired private RestTemplate restTemplate; public String sendPostRequest() { String url = "https://api.example.com/submit"; // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "application/json"); // 请求体 String requestBody = "{\"key1\":\"value1\", \"key2\":\"value2\"}"; // 构建请求实体 HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); // 发送POST请求 ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); return responseEntity.getBody(); } } ``` 在该示例中,`exchange`方法用于发送POST请求,并允许自定义请求头和请求体。`HttpEntity`用于封装请求头和请求体,`ResponseEntity`则用于接收完整的响应信息,包括状态码、响应头和响应体。 ### 处理响应 在调用外部接口时,除了获取响应体外,还可以通过`ResponseEntity`获取更多响应信息,例如状态码和响应头: ```java public void handleResponse() { String url = "https://api.example.com/data"; ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class); int statusCode = responseEntity.getStatusCodeValue(); // 获取状态码 String responseBody = responseEntity.getBody(); // 获取响应体 // 处理响应 } ``` ### 高级用法:自定义拦截器 `RestTemplate`还支持自定义拦截器,用于在请求发送前后执行特定逻辑(如日志记录、身份验证等)。以下是一个简单的拦截器示例: ```java import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; public class RequestInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 在请求发送前执行 System.out.println("Intercepting request: " + request.getURI()); // 执行请求 ClientHttpResponse response = execution.execute(request, body); // 在请求发送后执行 System.out.println("Received response with status code: " + response.getStatusCode()); return response; } } ``` 配置拦截器: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Autowired private RestTemplate restTemplate; public AppConfig(RestTemplate restTemplate) { this.restTemplate = restTemplate; // 添加拦截器 restTemplate.getInterceptors().add(new RequestInterceptor()); } } ``` ### 总结 通过上述步骤,可以在Spring Boot项目中高效地使用`RestTemplate`调用外部接口。无论是简单的GET请求,还是复杂的POST请求,`RestTemplate`都提供了灵活且强大的支持。此外,通过自定义拦截器,可以进一步增强请求的可观察性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值