java - Spring Boot Rest Controller 通用 POST 类型

标签 java spring rest spring-boot microservices

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

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

现在我有一个顶级 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 中包含我的所有对象类?我认为这应该可以,因为这与网络浏览器以 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 对象。

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

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

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

关于java - Spring Boot Rest Controller 通用 POST 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863771/

相关文章:

Spring Neo4j不保存数据

java - 是玩! Framework 2.0 适合创建 REST API 吗?

java - 如何在 Apache camel 中使用 POST 调用 REST?

java - Eclipse 如何知道 Swing Designer 是否可用于 JFrame 派生类?

java - 在 Java 中扩展 Throwable

java - 如何使用 Selenium 和 xpath 定位元素?

java - @Transactional 创建一个新的引用脏对象,即使它没有被修改

java - 如何在java中访问c++内存映射文件

java - Spring 用户事务与 hibernate

ruby-on-rails - 使用 Rails 存储线程安全的全局请求特定数据