我正在尝试使用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);

07-24 09:32