通过JSON中的RestTemplate进行POST请求。

问题描述 投票:1回答:1

我没有找到解决我的问题的例子,所以我想向你寻求帮助,我不能简单地使用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);

我到底错在哪里?

java spring-boot resttemplate
1个回答
159
投票

这个技术对我很有效。

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

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

希望能帮到你


93
投票

我在尝试调试一个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中去掉了双引号。


75
投票

我一直在使用 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
}

13
投票

按照指定的方式 此处 我想你需要添加一个 messageConverter 对于 MappingJacksonHttpMessageConverter


9
投票

如果你使用的是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。.


7
投票

415 Unsupported Media Type "错误告诉你,服务器将不接受你的POST请求。你的请求绝对没有问题,是服务器配置错误。

MappingJacksonHttpMessageConverter 会自动将请求的内容类型头设置为 application/json我的猜测是你的服务器正在拒绝这个。 你还没有告诉我们任何关于你的服务器设置,虽然,所以我真的不能给你建议。


7
投票

我是这样做的,它的工作。

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

希望能帮到你


4
投票

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

经过许多小时的各种实验,我发现这个问题是由于POST body传递了一个空引用而不是预期的List引起的。我猜测RestTemplate无法从一个空对象中确定内容类型,但并没有抱怨它。在添加了正确的头信息后,我开始在Spring中得到一个不同的服务端异常,然后才进入我的服务方法。

解决方法是从客户端传入一个空List而不是null。由于默认的content-type用于非空对象,所以不需要头信息。


3
投票

这段代码对我来说是可行的。

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

2
投票

如果你不想处理响应

private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);

如果您需要回复处理

String result = restTemplate.postForObject(url, entity, String.class);

0
投票

对我来说,这个设置发生了错误。

AndroidAnnotationsSpring Android RestTemplate Module和...

GsonHttpMessageConverter

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


0
投票

为什么要比你更努力工作呢?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);
}

0
投票

如果你不想自己映射JSON,你可以按以下方式进行。

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);
© www.soinside.com 2019 - 2024. All rights reserved.