通过 JSON 的 RestTemplate 发送 POST 请求

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

每次我得到:

异常: 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);

我有什么错?

454189 次浏览

“415不支持媒体类型”错误告诉您服务器将不接受您的 POST 请求。您的请求完全正常,是服务器配置错误。

MappingJacksonHttpMessageConverter会自动将请求内容类型头设置为 application/json,我猜测您的服务器正在拒绝这个设置。不过你还没告诉我们你的服务器设置所以我不能给你什么建议。

按照指定的 给你,我想您需要为 MappingJacksonHttpMessageConverter添加一个 messageConverter

如果使用 Spring 3.0,避免 异常: 415不支持的媒体类型异常的一个简单方法是在类路径中包含 jackson jar 文件,并使用 mvc:annotation-driven config 元素。按照这里的规定.

我绞尽脑汁想弄明白为什么 MVC-Ajax应用程序在没有任何特殊配置的情况下还能正常工作。如果你仔细阅读我上面链接的文章:

在被子下面,是 Spring MVC 委托到 HttpMessageConverter 执行序列化 例中,Spring MVC 调用一个 MappingJacksonHttpMessageConverter 建立在 Jackson JSON 处理器上。 已启用此实现 方法时自动 < strong > Mvc: 注释驱动的配置 杰克逊出现在你的 类路径 .

这个方法对我很有效:

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


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

希望这个能帮上忙

我对 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
}

对于我来说,这个设置出现了错误:

AndroidAnnotations Spring Android RestTemplate Module 还有..。

GsonHttpMessageConverter

Android 注释在转换为生成没有参数的 POST请求时存在一些问题。简单的参数 new Object()为我解决了这个问题。

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

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

经过几个小时的尝试,我发现这个问题是由于为 POST 主体传入了一个 null 引用而不是预期的 List 引用所造成的。我假设 RestTemplate 不能从 null 对象确定内容类型,但是不会抱怨它。在添加正确的头之后,在进入服务方法之前,我开始在 Spring 中获得一个不同的服务器端异常。

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

这个代码对我有用

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

我这样做,它的工作方式。

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

希望这个能帮上忙

如果您不想处理响应

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

如果您需要响应流程

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

为什么要比你必须要做的更努力呢?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);

我在弹簧靴里试了下面的方法:

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

您可以将请求作为 JSON 对象

JSONObject request = new JSONObject();
request.put("name","abc");
ResponseEntity<JSONObject> response =restTemplate.postForEntity(append_url,request,JSONObject.class);                                                          `enter code here`