RestTemplate进行httpPost访问

本文介绍了一种利用Spring Boot的RestTemplate简化HTTP请求访问的方法,通过实例展示了如何使用RestTemplate进行POST请求,并处理请求参数及响应结果。
通过RestTemplate访问实现了代码优雅简介的访问http请求,去掉了通过httplient繁琐的流程

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

/**
* restTemplate包装工具
*
* @author lichuang
* @since 2018-04-05
*/
public class RestTemplateUtil {

private static final Logger logger = LoggerFactory.getLogger(RestTemplateUtil.class);

private static final String CHARSET_NAME = "UTF-8";

private static final String MEDIA_TYPE = "application/json; charset=UTF-8";

/**
*
* @param url 请求URL地址
* @param paramMap 请求参数
* @param clazz 需要返回的类型
* @param <T> 需要返回的包装类型泛型
* @return
*/
public static <T> T httpPost(String url, Map<String,Object> paramMap, Class<T> clazz) {
if (CollectionUtils.isEmpty(paramMap)) {
paramMap = new HashMap<>();
}
String jsonParam = JSON.toJSONString(paramMap);
StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(Charset.forName(CHARSET_NAME));
RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(messageConverter).build();
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType(MEDIA_TYPE);
headers.setContentType(type);
HttpEntity<String> entity = new HttpEntity<String>(jsonParam,headers);
try {
String result = restTemplate.postForObject(url, entity, String.class);
return JSON.parseObject(result,clazz);
} catch (Exception e) {
logger.error("远程http请求发生异常:url:{},jsonParm:{},exception:{}",url,jsonParam,e);
return null;
}
}
}
### 如何在Spring中使用RestTemplate执行POST请求 `RestTemplate` 是 Spring 提供的一个用于客户端 HTTP 访问的核心类。它支持多种 HTTP 方法,其中包括 `POST` 请求。以下是关于如何使用 `RestTemplate` 执行 POST 请求的具体实现方法。 #### 创建并配置 RestTemplate 实例 可以通过直接实例化 `RestTemplate` 或者通过依赖注入的方式获取其 Bean。如果需要自定义功能(如设置超时时间),可以创建一个带有特定配置的 `RestTemplate` 实例: ```java @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.setConnectTimeout(Duration.ofMillis(3000)) .setReadTimeout(Duration.ofMillis(3000)) .build(); } ``` 此部分展示了如何通过 `RestTemplateBuilder` 构建具有连接和读取超时属性的 `RestTemplate` 对象[^1]。 #### 发送 POST 请求 为了向服务器发送数据并通过 REST API 接收响应,可以调用 `postForObject()` 或 `postForEntity()` 方法。下面是一个完整的例子,展示如何使用 `RestTemplate` 向指定 URL 发起 POST 请求并将返回的结果映射到 Java 类型对象中。 假设我们有一个简单的服务端接口 `/api/data` 需要接收 JSON 数据作为输入参数,并返回处理后的结果给客户端应用。 ##### 定义实体类 首先定义好用来封装请求体的数据模型以及期望接收到的服务端反馈信息结构: ```java // Request Body DTO public class DataRequest { private String name; private int value; // Getters and Setters... } // Response Body DTO public class DataResponse { private boolean success; private String message; // Getters and Setters... } ``` ##### 编写业务逻辑代码片段 接下来编写实际操作的部分,在这里我们将构建请求头、准备请求体然后提交至目标地址完成整个流程演示。 ```java @DataRequest dataReq = new DataRequest(); dataReq.setName("TestName"); dataReq.setValue(99); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<DataRequest> entity = new HttpEntity<>(dataReq, headers); String url = "http://example.com/api/data"; DataResponse result = restTemplate.postForObject(url, entity, DataResponse.class); if (result.isSuccess()) { System.out.println("Operation succeeded: " + result.getMessage()); } else { System.err.println("Error occurred during operation."); } ``` 上述代码段说明了怎样利用 `RestTemplate` 的 `postForObject` 函数发出携带复杂对象形式的内容类型的 HTTP POST 调用过程。 另外还可以采用另一种方式即 `exchange` 方法获得更灵活控制权的同时也能够取得更加详细的元数据比如状态码等附加信息: ```java ResponseEntity<DataResponse> response = restTemplate.exchange( url, HttpMethod.POST, entity, DataResponse.class ); HttpStatus statusCode = response.getStatusCode(); System.out.println("Status Code:" + statusCode.value()); DataResponse responseBody = response.getBody(); if (responseBody != null && responseBody.isSuccess()) { System.out.println("Success Message:" + responseBody.getMessage()); } ``` 以上两种途径都可以满足大多数场景下的需求差异仅在于后者提供了额外的功能选项以便开发者按需选用最合适的解决方案[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值