通过JSON中的RestTemplate发出POST请求

时间:2010-11-02 08:29:22

标签: java json spring rest resttemplate

我没有找到任何解决问题的例子,所以我想请你帮忙。我不能简单地使用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);

我的错是什么?

13 个答案:

答案 0 :(得分:142)

这项技术对我有用:

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

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

我希望这会有所帮助

答案 1 :(得分:85)

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

答案 2 :(得分:68)

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

答案 3 :(得分:13)

根据指定here我猜您需要为messageConverter添加MappingJacksonHttpMessageConverter

答案 4 :(得分:8)

如果您使用的是Spring,那么避免 org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型异常的简单方法是在您的类路径中包含jackson jar文件,并使用mvc:annotation-driven配置元素。 As specified here

我正在拉我的头发试图找出mvc-ajax应用程序在没有MappingJacksonHttpMessageConverter的任何特殊配置的情况下工作的原因。如果你仔细阅读我上面链接的文章:

  

封面下,Spring MVC   委托给HttpMessageConverter   执行序列化。在这   case,Spring MVC调用了一个   MappingJacksonHttpMessageConverter   基于Jackson JSON处理器构建。   此实现已启用   使用时自动   mvc:注释驱动的配置   与杰克逊的元素存在于你的   类路径

答案 5 :(得分:6)

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

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

答案 6 :(得分:5)

我正在这样做而且有效。

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

希望这有帮助

答案 7 :(得分:4)

我遇到了这个问题,我在客户端使用Spring的RestTemplate,在服务器上使用Spring Web。这两个API的错误报告都非常糟糕,因此很难开发它们。

经过几个小时的尝试各种各样的实验后,我发现问题是由传递POST主体的空引用而不是预期的List引起的。我认为RestTemplate不能从null对象中确定内容类型,但不会抱怨它。添加正确的标头后,我开始在Spring中获取不同的服务器端异常,然后再输入我的服务方法。

修复是从客户端传入一个空List而不是null。由于默认内容类型用于非null对象,因此不需要标头。

答案 8 :(得分: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);

答案 9 :(得分:2)

如果您不想处理响应

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

如果您需要对流程进行回复

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

答案 10 :(得分: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);
}

答案 11 :(得分:0)

如果您不想自己映射JSON,可以按照以下步骤进行操作:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);

答案 12 :(得分:0)

我在春季启动时尝试了以下操作:

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