我没有找到解决我的问题的例子,所以我想向你寻求帮助,我不能简单地使用JSON中的RestTemplate对象发送POST请求。我不能简单地使用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);
我到底错在哪里?
这个技术对我很有效。
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);
希望能帮到你
我在尝试调试一个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);
我的rest端点所使用的特定JSON解析器需要在字段名周围加上双引号,所以这就是为什么我在我的requestJson String中去掉了双引号。
我一直在使用 rest 模板和 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
}
按照指定的方式 此处 我想你需要添加一个 messageConverter
对于 MappingJacksonHttpMessageConverter
如果你使用的是Spring 3.0,一个简单的方法可以避免你在使用Spring 3.0时遇到的 org.springframework.web.client.HttpClientErrorException。415 不支持的媒体类型 例外情况下,在你的classpath中包含jackson jar文件,并使用 mvc:annotation-driven
配置元素。如这里指定的.
我拉着我的头发,想弄明白为什么要这样做 MVC-ajax 应用在没有任何特殊配置的情况下也能正常工作。MappingJacksonHttpMessageConverter
. 如果你仔细阅读我上面链接的文章。
掩盖之下,Spring MVC委托一个HttpMessageConverter来执行序列化。在这种情况下,Spring MVC调用了一个基于Jackson JSON处理器构建的MappingJacksonHttpMessageConverter。 这个实现是自动启用的 当您使用mvc:注解驱动的配置元素时,您的classpath中存在Jackson。.
415 Unsupported Media Type "错误告诉你,服务器将不接受你的POST请求。你的请求绝对没有问题,是服务器配置错误。
MappingJacksonHttpMessageConverter
会自动将请求的内容类型头设置为 application/json
我的猜测是你的服务器正在拒绝这个。 你还没有告诉我们任何关于你的服务器设置,虽然,所以我真的不能给你建议。
我是这样做的,它的工作。
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());
希望能帮到你
我正在遇到这个问题,我在客户端使用Spring的RestTemplate,在服务器上使用Spring Web。这两个API都有非常差的错误报告,使得它们的开发非常困难。
经过许多小时的各种实验,我发现这个问题是由于POST body传递了一个空引用而不是预期的List引起的。我猜测RestTemplate无法从一个空对象中确定内容类型,但并没有抱怨它。在添加了正确的头信息后,我开始在Spring中得到一个不同的服务端异常,然后才进入我的服务方法。
解决方法是从客户端传入一个空List而不是null。由于默认的content-type用于非空对象,所以不需要头信息。
这段代码对我来说是可行的。
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);
如果你不想处理响应
private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);
如果您需要回复处理
String result = restTemplate.postForObject(url, entity, String.class);
对我来说,这个设置发生了错误。
AndroidAnnotations
Spring Android RestTemplate Module
和...
GsonHttpMessageConverter
安卓注释有一些问题,这个转换为生成 POST
无参数的请求。只需参数 new Object()
为我解决了这个问题。
为什么要比你更努力工作呢?postForEntity
接受一个简单的 Map
对象作为输入。当我在Spring中为一个给定的REST端点编写测试时,下面的方法对我来说很好。我相信这是在Spring中进行JSON POST请求的最简单方式。
@Test
public void shouldLoginSuccessfully() {
// 'restTemplate' below has been @Autowired prior to this
Map map = new HashMap<String, String>();
map.put("username", "bob123");
map.put("password", "myP@ssw0rd");
ResponseEntity<Void> resp = restTemplate.postForEntity(
"http://localhost:8000/login",
map,
Void.class);
assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}
如果你不想自己映射JSON,你可以按以下方式进行。
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);