当前位置: 首页 > 知识库问答 >
问题:

如何将spring MVC控制器的请求数据管道化到spring RestTemplate

寿亦
2023-03-14

我有一个Spring MVC应用程序,它从UI(multiform和json)获取请求,并且必须使用Spring RestTemplate将这些数据发布到另一个微服务。在json内容类型的情况下,将请求作为字符串复制到RestTemplate可以很好地工作,但在Multipart的情况下似乎不起作用。

这是我的示例代码

Spring MVC控制器:

@Controller
public class MvcController {

  @RequestMapping(value = "/api/microservice",  method = RequestMethod.POST)
  public ResponseEntity<?> callMicroservice(HttpServletRequest request) throws Exception {
      RestTemplate rest = new RestTemplate();
      String payload = IOUtils.toString(request.getReader());
      HttpHeaders headers = new HttpHeaders();
      headers.add("Content-Type", request.getHeader("Content-Type"));
      HttpEntity<String> requestEntity = new HttpEntity<String>(payload, headers);
      return rest.exchange("https://remote.micrservice.com/api/backendservice", HttpMethod.POST, requestEntity, String.class);    
  }
}
@Controller
public class RestController {

  @RequestMapping(value = "/api/backendservice",  method = RequestMethod.POST)
  public @ResponseBody Object createService(@RequestParam(value = "jsondata") String jsondata,
        @RequestParam(value = "email") String email,@RequestParam(value = "xsltFile", required = false) MultipartFile xsltFile,
        HttpServletRequest request) {
      // process jsondata
      // process xsltFile
      // send response
  }
}
String payload = IOUtils.toString(request.getReader());

取而代之的是,我如何将请求数据按原样发送到RestTemplate请求,以便它同时适用于string和Multipart。如果你看MvcController签名,我不知道用户会在某个时候发送什么细节,我也不知道什么是微服务签名。我只需要在MvcController和RestTemplate请求之间管道化数据。

共有1个答案

陆绍辉
2023-03-14
@RequestMapping(value = "/api/microservice",  method = RequestMethod.POST)
  public ResponseEntity<?> callMicroservice(HttpServletRequest request) throws Exception {
      RestTemplate rest = new RestTemplate();
        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("jsondata", yourjsondata);
        map.add("email", youremail);
        map.add("xsltFile", new ClassPathResource(file));
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new    HttpEntity<LinkedMultiValueMap<String, Object>>(
                            map, headers);
        ResponseEntity<String > result = template.get().exchange(
                            contextPath.get() + path, HttpMethod.POST, requestEntity,
                            String.class);

}
 类似资料:
  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 我正在使用Java和Spring构建一个RESTAPI,我需要在我的控制器中处理一个POST请求,但我需要从该请求中提取主体,它是一个JSON,也是该请求的“来源”, 我有几个问题:首先是如何获取该请求的来源(我猜是在标题中移动的url?),是否有与@RequestBody类似的注释?。 我的第二个问题是,在这种post方法中,通常应该返回什么对象作为响应。

  • 问题内容: 在春季将请求转发到其他控制器的正确方法是什么? 所有的控制器都有Spring注入的依赖项,所以我不能只创建它们并自己调用它们,而是希望将请求属性传递给其他控制器。 问题答案: 尝试返回一个String,而该String为正向URL。

  • 问题内容: 我的图像是我试图将数据(变量)从一个阶段传递到另一阶段,但是当我尝试在第二阶段访问它们时,它们为空。mainWindow的代码。前往window1 // window1类: 如果我想访问以前收到的标题,则为null 初始化显示应该为“ Window1”时显示为null} 问题答案: 在加载FXML文件的过程中,将调用该方法-换句话说,在调用时将调用该方法。 显然,这是 在 调用 之前

  • 我在建一个拉威尔的网站。我希望提交的表单数据运行查询,并将结果插入表格式。我正在使用oracle DB,并已将其连接到Laravel。另外,我已经创建了表单,查询结果正确。我不能做的是将结果成功地传递到表中。 我的文件如下: > Routes.php(或web.php较新的laravel版本): 搜索。刀身php(带有post方法的表单) 我的控制器(NewController.php)运行查询。

  • 我有一个调查表列表,每个表都有一个按钮/asp操作,可以查看至少3个竞争对手的答案。但我需要使用模式选择调查表中的竞争对手。在该模式中,我应该在主体中填充一个复选框,其中包含回答该调查表的竞争对手。如何将数据切换模式导入控制器? 以下是我的看法: 这是我的控制器,它应该将值返回到索引模式: 我应该在正文中填入回答该调查表的竞争对手的复选框。但每当我单击“查看竞争对手”时,它不会转发给控制器。