Spring Boot Rest Controller 通用 POST 类型

Posted

技术标签:

【中文标题】Spring Boot Rest Controller 通用 POST 类型【英文标题】:SpringBoot RestController generic POST type 【发布时间】:2015-12-28 02:27:20 【问题描述】:

我正在尝试使用 Spring Boot 构建微服务。

我有一个后端 API,它接收 ResponseEntity POST 请求并处理它(保存到数据库等)。其中Data是自建类的Object。

现在我有一个*** API(处理身份验证,..)。最终用户将通过这个*** API 与后端服务进行通信。所以这个 API 基本上只需要将所有请求转发到正确的后端 api。

在这个*** API 中,我不想包含我的所有类(例如本例中的 Data 类),我宁愿将其作为 String json 数据或其他内容发送。所以我尝试了这个:

@RequestMapping(method = RequestMethod.POST, value="/data")
    ResponseEntity<String> createUnit(@RequestBody String data) 
        URI uri = util.getServiceUrl("dataservice");
        String url = uri.toString() + "/data";

        ResponseEntity<String> result = restTemplate.postForEntity(url, data, String.class);
        return new ResponseEntity<String>(result.getBody(), HttpStatus.OK);
    

但这会导致org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

所以我的问题是,有没有一种方法可以将这些请求转发到我的后端,而无需在我的 API 中包含我的所有 Object 类?我认为这应该可以,因为这与网络浏览器以 json 格式发送请求而不知道数据实际是什么类型的对象时相同。

后端处理如下:

@RequestMapping(method = RequestMethod.POST, value="/data")
ResponseEntity<Data> saveData(@RequestBody Data data) 
    //Some code that processes the data
    return new ResponseEntity<Data>(dataProcessed, HttpStatus.OK);

【问题讨论】:

您不需要返回ResponseEntity&lt;Data&gt;。直接使用数据。这会将数据序列化为 Json。如果需要,您可以使用 Jackson 转换器。如果需要通用返回类型,请使用基类作为返回类型 @ViswanathLekshmanan 底层 API 也会发送匹配的 HttpStatus 代码,例如404 未找到 Data 对象,或 204 成功删除等。确定 HttpStatus 代码的逻辑与这些底层 API 一起使用,不应发生在顶层。这就是我使用ResponseEntity 发送数据的原因 【参考方案1】:

String 发布到后端服务时,您必须指定Content-Type 标头,以便Spring 知道使用哪个HttpMessageConverter 来反序列化Data 对象。

使用RestTemplate,您可以像这样指定标题:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(data, headers);
restTemplate.postForEntity(url, entity, responseType);

【讨论】:

谢谢,这行得通!我发现的另一个解决方案是使用Object 作为数据类型而不是String【参考方案2】:

即使问题已经得到解答,我也会展示另一种我设法解决问题的方法。

我使用了Object 类型而不是String

@RequestMapping(method = RequestMethod.POST, value="/data")
ResponseEntity<Object> createUnit(@RequestBody Object data) 
    URI uri = util.getServiceUrl("dataservice");
    String url = uri.toString() + "/data";

    ResponseEntity<Object> result = restTemplate.postForEntity(url, data, Object.class);
    return new ResponseEntity<Object>(result.getBody(), HttpStatus.OK);

【讨论】:

以上是关于Spring Boot Rest Controller 通用 POST 类型的主要内容,如果未能解决你的问题,请参考以下文章

列出所有已部署的 REST 端点(spring-boot、tomcat)

初入spring boot(八 )Spring Data REST

Spring Boot测试中使用REST Assured(转)

spring boot开发REST接口

Spring Boot 2 Rest Api Example

如何在 Spring(Boot)中装饰 REST 响应?