135

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

我的错是什么?

4

15 回答 15

175

这种技术对我有用:

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

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

我希望这有帮助

于 2011-05-25T17:24:13.013 回答
107

我在尝试调试 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 字符串中转义了双引号。

于 2015-06-03T14:51:21.923 回答
93

我一直在使用带有 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
}
于 2014-11-24T13:54:38.277 回答
14

如指定here我猜你需要添加一个messageConverterfor MappingJacksonHttpMessageConverter

于 2010-11-02T12:14:49.383 回答
12

我正在这样做并且它有效。

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

希望这可以帮助

于 2017-11-21T11:29:04.773 回答
10

如果您使用的是 Spring 3.0,避免org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type异常的简单方法是在类路径中包含 jackson jar 文件,并使用mvc:annotation-drivenconfig 元素。如此处所指定

我正在努力弄清楚为什么mvc-ajax应用程序在没有任何特殊配置的情况下工作MappingJacksonHttpMessageConverter。如果您仔细阅读我上面链接的文章:

在幕后,Spring MVC 委托给 HttpMessageConverter 来执行序列化。在这种情况下,Spring MVC 调用一个建立在 Jackson JSON 处理器上的 MappingJacksonHttpMessageConverter。当您使用 mvc:annotation-driven 配置元素时自动启用此实现,而 Jackson 存在于您的 classpath中。

于 2011-05-19T17:45:47.640 回答
7

“415 Unsupported Media Type”错误告诉您服务器不会接受您的 POST 请求。您的请求绝对没问题,是服务器配置错误。

MappingJacksonHttpMessageConverter将自动将请求内容类型标头设置为application/json,我猜您的服务器正在拒绝它。但是,您还没有告诉我们有关您的服务器设置的任何信息,因此我无法就此提供任何建议。

于 2010-11-02T08:47:24.147 回答
4

我遇到了这个问题,我在客户端上使用 Spring 的 RestTemplate,在服务器上使用 Spring Web。两种 API 的错误报告都非常差,因此开发起来非常困难。

经过数小时尝试各种实验后,我发现问题是由为 POST 正文而不是预期的 List 传递空引用引起的。我认为 RestTemplate 无法从空对象确定内容类型,但不会抱怨它。添加正确的标头后,在进入我的服务方法之前,我开始在 Spring 中获得不同的服务器端异常。

解决方法是从客户端传入一个空列表而不是 null。由于默认内容类型用于非空对象,因此不需要标头。

于 2015-10-06T15:02:23.633 回答
4

为什么比你必须更努力地工作?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);
}
于 2019-05-16T14:46:30.203 回答
4

这段代码对我有用;

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);
于 2016-10-20T11:10:39.350 回答
2

如果您不想处理响应

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

如果您需要响应流程

String result = restTemplate.postForObject(url, entity, String.class);
于 2018-12-12T12:26:35.450 回答
0

对我来说,此设置发生错误:

AndroidAnnotations Spring Android RestTemplate Module 和 ...

GsonHttpMessageConverter

POSTAndroid 注释在转换为无参数生成请求时存在一些问题。简单的参数new Object()为我解决了它。

于 2015-05-05T10:17:23.800 回答
0

您可以将请求作为 JSON 对象

JSONObject request = new JSONObject();
request.put("name","abc"); 
ResponseEntity<JSONObject> response =restTemplate.postForEntity(append_url,request,JSONObject.class);                                                          `enter code here`
于 2021-10-04T06:50:41.383 回答
0

我在spring boot中尝试如下:

ParameterizedTypeReference<Map<String, Object>> typeRef = new ParameterizedTypeReference<Map<String, Object>>() {};
public Map<String, Object> processResponse(String urlendpoint)
{
    try{
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //reqobj
        JSONObject request = new JSONObject();
        request.put("username", name);
        //Or Hashmap 
        Map<String, Object> reqbody =  new HashMap<>();
        reqbody.put("username",username);
        Gson gson = new Gson();//mvn plugin to convert map to String
        HttpEntity<String> entity = new HttpEntity<>( gson.toJson(reqbody), headers);
        ResponseEntity<Map<String, Object>> response = resttemplate.exchange(urlendpoint, HttpMethod.POST, entity, typeRef);//example of post req with json as request payload
        if(Integer.parseInt(response.getStatusCode().toString()) == HttpURLConnection.HTTP_OK)
        {
            Map<String, Object>  responsedetails = response.getBody();
            System.out.println(responsedetails);//whole json response as map object
            return responsedetails;
        }
    } catch (Exception e) {
        // TODO: handle exception
        System.err.println(e);
    }
    return null;
}
于 2020-07-08T12:46:33.277 回答
0

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

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);
于 2020-05-07T18:14:44.217 回答