通过JSON中的RestTemplate发送POST请求

我没有find任何例子来解决我的问题,所以我想问你的帮助。 我不能简单地使用JSON中的RestTemplate对象发送POST请求

每当我得到org.springframework.web.client.HttpClientErrorException:415不支持的媒体types

我以这种方式使用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); 

我的错是什么?

这个技巧对我有用:

 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

尝试debuggingREST端点时遇到此问题。 下面是一个使用Spring的RestTemplate类来创buildPOST请求的基本示例。 我花了相当长的时间把不同地方的代码拼凑在一起才得到一个工作版本。

 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); 

特定的JSONparsing器我的rest端点正在使用所需的双引号字段名称,所以这就是为什么我已经逃脱了我的requestJsonstring中的双引号。

我一直在使用JSONObjects的rest模板如下:

 // 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 } 

正如我在这里指定的,我想你需要为MappingJacksonHttpMessageConverter添加一个messageConverter

“415不支持的媒体types”错误告诉你,服务器不会接受你的POST请求。 你的请求是绝对正确的,这是错误configuration的服务器。

MappingJacksonHttpMessageConverter会自动将请求的内容types头设置为application/json ,我的猜测是你的服务器拒绝了这个。 但是,您还没有告诉我们有关您的服务器设置的任何信息,所以我不能就此提供build议。

如果您使用的是Spring 3.0,避免org.springframework.web.client.HttpClientErrorException:415 Unsupported Media Typeexception的简单方法是将jackson jar文件包含在您的类path中,并使用mvc:annotation-driven config元素。 如此处所述 。

我拉着我的头发,试图找出为什么mvc-ajax应用程序没有任何特殊的configurationMappingJacksonHttpMessageConverter 。 如果你仔细阅读我上面链接的文章:

在封面之下,Spring MVC委托HttpMessageConverter来执行序列化。 在这种情况下,Spring MVC调用一个基于Jackson JSON处理器的MappingJacksonHttpMessageConverter。 当您在classpath中使用带有Jackson的mvc:annotation-drivenconfiguration元素时,会自动启用此实现。

我得到这个问题,我在服务器上的客户端和Spring Web上使用Spring的RestTemplate。 这两个API都具有非常差的错误报告,使得它们非常难以开发。

经过几个小时的尝试各种各样的实验,我发现这个问题是由于传递一个空引用而不是预期的List。 我认为RestTemplate不能确定从空对象的内容types,但不抱怨它。 在添加正确的头文件之后,在进入我的服务方法之前,我开始在Spring中得到一个不同的服务器端exception。

解决的办法是从客户端传入一个空的List,而不是null。 由于缺省内容types用于非空对象,因此不需要标头。

此代码正在为我工​​作;

 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); 

对于我这个设置发生错误:

AndroidAnnotations Spring Android RestTemplate Module和…

GsonHttpMessageConverter

Android注释有一些问题,这转换为生成POST请求没有参数。 只需参数new Object()解决了我。