RestTemplate发送数据为JSON的Post请求
Posted Java咩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RestTemplate发送数据为JSON的Post请求相关的知识,希望对你有一定的参考价值。
目录
零、参考文献
一、写在前面
最近写一个小游戏,需要服务端向匹配端发送Json数据,记录业务端需要向服务端用RestTemplate发送Post请求,且数据为JSON格式时的请求方式
二、问题场景
业务端需要请求服务端的 /player/add
接口,但是 /player/add
接口接收的是 JSON
数据,即接口参数被 @RequestBody
注解修饰。
三、场景重现
业务端代码
请求对象的Url,以本地为例
public interface MatchingConstant
/**
* 匹配系统 添加玩家的 Url
*/
String addPlayerUrl = "http://127.0.0.1:3001/player/add";
/**
* 匹配系统 移除玩家的 Url
*/
String removePlayerUrl = "http://127.0.0.1:3001/player/remove";
websocket请求转发逻辑
@Component
@ServerEndpoint("/websocket/token")
@Slf4j
public class WebSocketServer
private User user;
private void startMatching()
log.info("======> start Matching");
MatchingRequest matchingRequest = new MatchingRequest(this.user.getId(), this.user.getRating());
Map<String, String> requestBody = new HashMap<>();
requestBody.put("userId", String.valueOf(this.user.getId()));
requestBody.put("rating", String.valueOf(this.user.getRating()));
HttpHeaders requestHeaders = new HttpHeaders();
// 重点是配置请求头内容类型为:"application/json"
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, String>> r = new HttpEntity<>(requestBody, requestHeaders);
// 请求服务端添加玩家
String data= restTemplate.postForObject(MatchingConstant.addPlayerUrl, r, String.class);
服务端代码
接收参数的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor // 无参构造用于反序列化
public class MatchingRequest
private int userId;
private int rating;
public MatchingRequest(int userId)
this.userId = userId;
服务端Controller层接口
@RestController
@RequestMapping("/player/")
public class MatchingController
/**
* service 层代码略
*/
@Resource
private MatchingService matchingService;
@PostMapping("/add")
public String addPlayer(@RequestBody MatchingRequest matchingRequest )
return matchingService.addPlayer(matchingRequest);
@PostMapping("/remove")
public String removePlayer(@RequestBody MatchingRequest matchingRequest)
return matchingService.removePlayer(matchingRequest);
其余层代码略
四、总结反思
- 通过RestTemplate发送Post请求,请求体为Json或其他非文本格式,需要更改请求体中
ContentType
- 接收请求的实体类需要无参构造方法,不然无法反序列化,详见:点我跳转
五、写在后面
欢迎关注,实现期间会经常记录一些项目实践中遇到的问题。
欢迎随时留言讨论,与君共勉,知无不答!
RestTemplate发送json请求
JSONObject json = new JSONObject(); json.put("train_date", train_date); json.put("from_station", fromStationCode); json.put("to_station", toStationCode); json.put("logFlag", logFlag); HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); headers.setContentType(type); headers.add("Accept", MediaType.APPLICATION_JSON.toString()); HttpEntity<String> formEntity = new HttpEntity<String>(json.toString(), headers); String s= restTemplate.postForEntity(url,formEntity,String.class).getBody();
以上是关于RestTemplate发送数据为JSON的Post请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?
通过 JSON 中的 RestTemplate POST 请求
使用RestTemplate发送multipart/form-data格式的数据
FastJson处理数据出现错误 com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 1(示例代