如何使用 RequestBody 和 PostMapping 在两台服务器之间共享数据?
Posted
技术标签:
【中文标题】如何使用 RequestBody 和 PostMapping 在两台服务器之间共享数据?【英文标题】:How to share data between two server using RequestBody and PostMapping? 【发布时间】:2021-10-14 04:45:30 【问题描述】:我正在尝试使用 ResponseEntity 在 Spring Boot 中将数据从一台服务器 (8081) 共享到另一台服务器 (8082),但我无法构建主体。
这是我写的代码,
服务器 1-
@GetMapping("/redirect")
public ResponseEntity<Void> redirectPgServer(@RequestParam("txnId") String txnId,
@RequestParam("amount") String amount)
// Redirect to server 2
ProductDetails ref=new ProductDetails();
ref.setTxnId("txnId");
ref.setAmount("amount);
HttpHeaders head = new HttpHeaders();
String url = "http://localhost:8082/redirect-server";
System.out.println(url);
head.setLocation(URI.create(url));
return new ResponseEntity<Void>(ref, head, HttpStatus.FOUND);
服务器2-
@GetMapping(value = "/redirect-server")
public String validateData(@RequestBody ProductDetails ref)
//Server 2 receive data
System.out.println(ref.getAmount());
//Does not gives any output since it throws error Request Body Missing, also if I mention
post mapping above it throws error Request method 'GET' not supported]
return "index"; //Using Thymeleaf for displaying html page.
我可以通过操纵 url 和使用 PathVariable 仅使用 header 共享数据,但我想使用 Post Mapping 因为我想隐藏参数在浏览器中对用户可见的 URL。我还尝试使用 RestTemplate 将我带回服务器 1 并引发错误 - Spring rest 模板无法从 text/html utf8 转换。
【问题讨论】:
这个问题不完整。这里没有通讯。只有一个定义的端点,另一个似乎什么都不做的端点。缺少的部分很可能是您遇到问题的地方。 您很可能需要将ResponseEntity<Void>
更改为ResponseEntity<ProductDetails>
【参考方案1】:
我的建议是用@PostMapping
注释这两种方法,同时删除@RequestBody
注释。在第一个服务器中,您应该使用 307 HTTP 代码(这是临时重定向)进行响应,基本上这会告诉浏览器,重试对另一个端点的调用(在 Location 标头中给出)。
类似这样的:
服务器 1
@PostMapping(value = "/redirect", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity redirect(Product product)
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(URI.create("http://localhost:8082/product"));
return new ResponseEntity(httpHeaders, HttpStatus.TEMPORARY_REDIRECT);
服务器 2
@PostMapping(value = "/product", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void redirect(Product prod)
System.out.println(prod.getId());
//do your stuff
HTML 页面
<html>
<body>
<form action="http://localhost:8081/redirect" method="POST">
<input name="id">
<input name="name">
<button type="submit">Send</button>
</form>
</body>
</html>
如果您不使用表单,而是使用某种异步调用,您必须指定 url 表单编码。否则你会得到一个 405。
我已经用邮递员和一个 html 页面尝试过代码,它确实可以正常工作。 (用 Firefox 试过)
如果有不清楚的地方不要问。
我发现了一个类似的问题,我从中获得了灵感 A good way to redirect with a POST request?
【讨论】:
以上是关于如何使用 RequestBody 和 PostMapping 在两台服务器之间共享数据?的主要内容,如果未能解决你的问题,请参考以下文章
Ajax JQuery 到 Spring @RequestBody?我如何传递数据?
如何将 @RequestBody 与 JSONP 请求一起使用?
SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数
如何使用附加的@RequestBody 在 POST 请求中将 Pageable 传递给 Feign 客户端
Spring Boot 和 MVC:如何从 application.properties 为 @RequestBody 对象字段设置默认值?