我正在尝试使用Spring Boot构建微服务。
我有一个后端API,用于接收ResponseEntity POST请求并对其进行处理(保存到数据库等)。其中数据是自创建类的对象。
现在,我有一个顶级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类?我认为这应该是可行的,因为这与Web浏览器以json格式发送请求而又不知道数据实际是哪种Object相同。
后端处理如下所示:
@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);
}
最佳答案
将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);