2015-09-30 41 views
2

我正在嘗試使用Spring Boot構建微服務。SpringBoot RestController通用POST類型

我有一個後端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中包含所有的對象類?我認爲這應該是可以的,因爲這與Web瀏覽器以json格式發送請求時不知道數據實際是什麼類型的對象時相同。

後端處理是這樣的:

​​
+0

你不需要返回'ResponseEntity '。直接使用數據。這會將數據序列化爲Json。如果需要,你可以使用Jackson轉換器。如果您需要公共返回類型,請使用基類作爲返回類型 –

+0

@ViswanathLekshmanan底層API還會發送匹配的「HttpStatus」代碼,例如,當沒有找到Data對象時爲'404',或者成功刪除時爲'204'等。確定HttpStatus代碼的邏輯是使用這些底層API,並且不應該發生在頂層。這就是爲什麼我使用'ResponseEntity'發送數據。 – Kaj

回答

2

當張貼String到後端服務,您有這麼Spring知道使用反序列化Data對象,HttpMessageConverter指定Content-Type頭。

隨着RestTemplate您可以指定標題是這樣的:

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

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

謝謝,這個工程!我發現的另一個解決方案是使用Object作爲數據類型而不是String – Kaj

0

即使問題已經回答了,我會告訴另一種方式,我設法解決這個問題。

我用型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); 
}