将 JSON POST 请求从一个 REST API 转发到另一个

Posted

技术标签:

【中文标题】将 JSON POST 请求从一个 REST API 转发到另一个【英文标题】:Forward JSON POST request from one REST API to another 【发布时间】:2016-12-14 06:02:22 【问题描述】:

我有以下情况:

我的 REST API 之一:

@RestController
@RequestMapping("/controller1")
Public Class Controller1
    @RequestMapping(method = RequestMethod.POST)
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    
       ............
    

用于 REST API(Controller1) 的 JSON POST 请求,request1:


  "key1":"value1",
  "key2":"value2"

我的 REST API 二:

@RestController
@RequestMapping("/controller2")
Public Class Controller2
    @RequestMapping(method = RequestMethod.POST)
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    
       ............
    

用于 REST API(Controller2) 的 JSON 请求,request2:


  "key1":"value1",
  "key2":"value2",
  "key3":"value3"

我有几个这样的“原始”请求。 现在,我期待一个 JSON 请求,我们称之为 request3,它是此类“原始”查询的组合——如下所示:


   
      "requestType":"requestType1",
      "request":"["key1":"value1","key2":"value2"]"
   ,
   
      "requestType":"requestType2",
      "request":"["key1":"value1","key2":"value2","key3":"value3"]"
   

在这里,我需要在识别查询类型时触发相应的 API(一个或两个)。我想知道如何将请求转发到相应的 REST API。我为 request3 编写了 REST API,如下所示:

@RestController
@RequestMapping("/controller3")
Public Class Controller3
    @RequestMapping(method = RequestMethod.POST)
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    
      ..................
      ..................

      switch(request)
         case request1: //how to call REST API 1?
         case request2: //how to call REST API 2?
      
    

【问题讨论】:

【参考方案1】:

您可以调用一个实用方法,使用下面的 Rest Template 将请求发布到控制器。由于您使用的是 POST 方法,因此使用 Rest Template 发送参数很容易。您可能需要稍微编辑此代码才能在您的环境中使用准确的语法。

@RequestMapping( value= "/controller3" method = RequestMethod.POST)
 public @ResponseBody void process(@RequestBody String jsonString)

    String request = requestType //Get the request type from request
    String url = "";
    MultiValueMap<String, String> params= null;
    switch(request)
         case request1: //how to call REST API 1?
            url = "/controller1";
            params = request1param //Get the parameter map from request 
         case request2: //how to call REST API 2?
            url = "/controller2";
            params = request2Param //Get the parameter map from request 
      

      //Now call the method with parameters
      getRESTResponse(url, params);

  

  private String getRESTResponse(String url, MultiValueMap<String, String> params)
     RestTemplate template = new RestTemplate();
     HttpEntity<MultiValueMap<String, String>> requestEntity= 
            new HttpEntity<MultiValueMap<String, String>>(params);
    String response = "";
     try
        String responseEntity = template.exchange(url, HttpMethod.POST, requestEntity,  String.class);
        response = responseEntity.getBody();
    
    catch(Exception e)
        response = e.getMessage();
    
    return response;
  

Redirect from one controller method to another controller method

或者,您也可以使用 Rest Template 调用 rest 方法 Spring MVC - Calling a rest service from inside another rest service

您可以在这篇文章中找到如何使用参数发送 POST 请求 https://techie-mixture.blogspot.com/2016/07/spring-rest-template-sending-post.html

【讨论】:

感谢@TharsanSivakumar 的回复。但是,在从整个请求中提取之后,如何将 sendRedirect 方法中所需的请求字符串发送到目标 REST API?请注意目标 REST API 方法具有以下签名:@RequestMapping(method = RequestMethod.POST) public void process(@RequestBody String jsonString) 我已经编辑了我的答案,而不仅仅是重定向,您可以使用 Spring 的 Rest 模板轻松发送带参数的请求

以上是关于将 JSON POST 请求从一个 REST API 转发到另一个的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF REST 服务 POST 方法中处理 Json 请求数据

将 JSON 请求循环到后端(REST API)

尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误

REST API:请求正文为 JSON 或纯 POST 数据?

将 POST 请求从一个 REST API 转发/重定向到另一个

如何使用JSON正文在REST API POST方法中传递多个记录