2010-11-02 239 views
81

我沒有找到任何示例如何解決我的問題,所以我想問你的幫助。使用RestTemplate對象,我不能簡單地發送POST請求JSON通過JSON中RestTemplate的POST請求

每次我org.springframework.web.client.HttpClientErrorException:415不支持的媒體類型

我以這種方式使用RestTemplate:

... 
restTemplate = new RestTemplate(); 
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>(); 
list.add(new MappingJacksonHttpMessageConverter()); 
restTemplate.setMessageConverters(list); 
... 
Payment payment= new Payment("Aa4bhs"); 
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class); 

我的過錯是什麼?

+1

@troyfolger的URL不再有效 – Noremac 2015-05-13 21:25:23

+0

感謝 - 這個環節的工作,因爲這寫的:https://開頭春天.io/guides/gs/consume-rest/ – troyfolger 2015-09-10 17:42:03

+0

要解決上述特定的OP問題,您可能會丟失具有適當內容類型的HTTP標頭,請參閱下面的morganw09dev答案。 – troyfolger 2015-09-10 17:45:37

回答

6

「415 Unsupported Media Type」錯誤告訴你服務器不接受你的POST請求。您的請求絕對沒問題,它是錯誤配置的服務器。

MappingJacksonHttpMessageConverter會自動將請求內容類型標頭設置爲application/json,我的猜測是你的服務器拒絕了。但是,您還沒有告訴我們有關您的服務器設置的任何信息,所以我不能就此提供建議。

9

按規定here我想你需要添加一個messageConverterMappingJacksonHttpMessageConverter

5

如果您在使用Spring 3.0,一個簡單的方法,以避免org.springframework.web.client.HttpClientErrorException:415不支持的媒體類型例外,是將jackson jar文件包含在你的類路徑中,並使用mvc:annotation-driven配置元素。 As specified here

我拉着我的頭髮試圖找出爲什麼mvc-ajax應用程序沒有任何特殊的配置MappingJacksonHttpMessageConverter。如果你看了我上面緊密相連的文章:

下方的蓋子,Spring MVC的 委託給HttpMessageConverter到 執行序列。在這種情況下,Spring MVC調用在Jackson JSON處理器上構建的MappingJacksonHttpMessageConverter 。註解驅動的配置 元素與傑克遜出現在你的classpath :當您使用 MVC 此實現啓用 自動

105

此技術爲我工作:

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

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers); 
ResponseEntity<String> response = restTemplate.put(url, entity); 

我希望這有助於

KD

+3

請解釋哪一行應該返回http請求的結果 – gstackoverflow 2015-03-13 07:59:11

+0

對於我來說,沒有必要指定任何頭文件。我使用了帶有單個參數的HttpEntity。 – 2017-05-17 18:42:07

+0

可能是我見過的最簡單但有效的解決方案之一! – JavaTec 2018-03-09 22:04:49

53

我一直在使用其他模板,一個JSONObjects如下:

// create request body 
JSONObject request = new JSONObject(); 
request.put("username", name); 
request.put("password", password); 

// set headers 
HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers); 

// send request and parse result 
ResponseEntity<String> loginResponse = restTemplate 
    .exchange(urlString, HttpMethod.POST, entity, String.class); 
if (loginResponse.getStatusCode() == HttpStatus.OK) { 
    JSONObject userJson = new JSONObject(loginResponse.getBody()); 
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) { 
    // nono... bad credentials 
} 
+0

謝謝 - JSONObject toString方法對我很有用,它幫助我獲得準確的JSONString。 – Simon 2015-12-21 20:02:52

+1

如何開發上面的代碼:curl -vvv -X POST「http:// localhost:8080/SillyService_SRC/oauth/token?grant_type = password&client_id = my-trusted-client&username = admin&password = password「? – Prateek 2016-08-19 11:23:22

+0

@MikaelLepistö如何從服務器端的json檢索這些參數?? – KJEjava48 2017-02-15 10:35:19

0

對於我這個設置發生錯誤:

AndroidAnnotations Spring Android RestTemplate Module ...

GsonHttpMessageConverter

的Android註釋有一些問題與此變換,生成不帶參數POST請求。只需參數new Object()爲我解決了它。

58

我試圖調試REST端點時遇到了這個問題。這裏是一個使用Spring的RestTemplate類來創建我使用的POST請求的基本示例。我花了相當長的時間來拼湊來自不同地方的代碼以獲得工作版本。

RestTemplate restTemplate = new RestTemplate(); 

String url = "endpoint url"; 
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}"; 
HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers); 
String answer = restTemplate.postForObject(url, entity, String.class); 
System.out.println(answer); 

特定JSON解析器我休息終點周圍使用字段名需要雙引號所以這就是爲什麼我在我的requestJson字符串逃過了雙引號。

+0

可以請你幫我在這個http://stackoverflow.com/questions/42240927/how-to-search-via-json-in-elastic-search -using-spring-resttemplate-in-android – FaisalAhmed 2017-02-16 10:16:58

+0

春天可以使用消息轉換器自動將Java對象轉換爲json,就像它在Restful API中使用RestTemplate一樣? – fall 2017-08-10 10:21:47

+0

這對我有用。 – bynu022 2018-02-16 04:30:19

2

我遇到了這個問題,我在服務器上的客戶端和Spring Web上使用了Spring的RestTemplate。這兩個API的錯誤報告都很差,使得它們非常難以開發。

經過幾個小時的嘗試各種各樣的實驗後,我發現這個問題是由於POST體的空引用而不是預期的List導致的。我認爲RestTemplate不能從空對象中確定內容類型,但不會抱怨它。在添加了正確的標題後,我開始在Spring中獲得一個不同的服務器端異常,然後才進入我的服務方法。

修復方法是從客戶端傳入空列表而不是空。由於缺省內容類型用於非空對象,因此不需要標頭。

2

此代碼適用於我;

RestTemplate restTemplate = new RestTemplate(); 
Payment payment = new Payment("Aa4bhs"); 
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); 
map.add("payment", payment); 
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject); 

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class); 
1

我正在這樣做,它的工作原理。

HttpHeaders headers = createHttpHeaders(map);

public HttpHeaders createHttpHeaders(Map<String, String> map) 
{ 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    for (Entry<String, String> entry : map.entrySet()) { 
     headers.add(entry.getKey(),entry.getValue()); 
    } 
    return headers; 
} 

//通行證這裏頭

String requestJson = "{ // Construct your JSON here }"; 
logger.info("Request JSON ="+requestJson); 
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers); 
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody()); 
logger.info("Response ="+response.getBody()); 

希望這有助於