如何使用 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&lt;Void&gt; 更改为ResponseEntity&lt;ProductDetails&gt; 【参考方案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 对象字段设置默认值?