Spring Boot Rest Controller 通用 POST 类型
SpringBoot RestController generic POST type
我正在尝试使用 Spring Boot 构建微服务。
我有一个后端 API 接收 ResponseEntity POST 请求并处理它(保存到数据库等)。其中 Data 是一个自己创建的对象 class.
现在我有一个顶级 API(处理身份验证,..)。最终用户将通过这个顶级 API 与后端服务进行通信。所以这个 API 基本上只需要将所有请求转发到正确的后端 api。
在这个顶部 API 我不想包含我所有的 classes(例如在这种情况下的数据 class)我宁愿只发送它作为 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
。
所以我的问题是,有没有一种方法可以将这些请求转发到我的后端,而无需将我的所有对象 class 包含在我的 API 中?我认为这应该可以,因为这与网络浏览器以 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);
}
将 String
发布到后端服务时,您必须指定 Content-Type
header,以便 Spring 知道使用哪个 HttpMessageConverter
来反序列化Data
object.
使用 RestTemplate
,您可以像这样指定 header:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(data, headers);
restTemplate.postForEntity(url, entity, responseType);
尽管问题已经得到解答,但我将展示我设法解决问题的另一种方法。
我使用类型 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 构建微服务。
我有一个后端 API 接收 ResponseEntity POST 请求并处理它(保存到数据库等)。其中 Data 是一个自己创建的对象 class.
现在我有一个顶级 API(处理身份验证,..)。最终用户将通过这个顶级 API 与后端服务进行通信。所以这个 API 基本上只需要将所有请求转发到正确的后端 api。
在这个顶部 API 我不想包含我所有的 classes(例如在这种情况下的数据 class)我宁愿只发送它作为 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
。
所以我的问题是,有没有一种方法可以将这些请求转发到我的后端,而无需将我的所有对象 class 包含在我的 API 中?我认为这应该可以,因为这与网络浏览器以 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);
}
将 String
发布到后端服务时,您必须指定 Content-Type
header,以便 Spring 知道使用哪个 HttpMessageConverter
来反序列化Data
object.
使用 RestTemplate
,您可以像这样指定 header:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(data, headers);
restTemplate.postForEntity(url, entity, responseType);
尽管问题已经得到解答,但我将展示我设法解决问题的另一种方法。
我使用类型 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);
}