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<Data>
。直接使用数据。这会将数据序列化为 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(转)