2010-11-02 295 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()); 

希望这有助于