如何使用RestTemplate正确设置POST请求的请求体?
RestTemplate发送POST请求无法正确传递请求体的问题解决
初始代码的核心问题
你最初的代码里用了HttpMethod.GET请求,GET请求通常不支持携带请求体——哪怕你通过HttpEntity设置了请求体,服务器也不会处理这部分内容,这是导致响应不符合预期的根本原因。
更新后代码的错误原因
更新后的代码改成了POST请求,但依然报错,问题出在请求体格式不匹配:
你设置了Content-Type: application/json,但请求体是普通字符串"hello world 4",这不是合法的JSON格式(合法的JSON字符串需要用双引号包裹,比如"\"hello world 4\"";如果是JSON对象则要符合键值对结构),所以服务器返回400错误提示无法读取JSON负载。
解决方法
根据服务器的实际要求,选以下两种方案之一:
方案1:发送合法JSON格式的请求体
如果服务器期望JSON类型的请求体,把请求体改成合法的JSON格式:
public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth("token"); headers.add("Header", "header1"); // 合法的JSON字符串:用双引号包裹内容 String body = "\"hello world 4\""; HttpEntity<String> entity = new HttpEntity<>(body, headers); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("www.example.com"); try { HttpEntity<String> response = restTemplate.exchange( builder.toUriString(), HttpMethod.POST, entity, String.class); System.out.println(response.getBody()); } catch (HttpClientErrorException e) { // 打印详细错误信息排查问题 System.out.println(e.getResponseBodyAsString()); } }
如果需要发送JSON对象,可以定义实体类让RestTemplate自动序列化:
// 示例消息实体类 class Message { private String content; public Message(String content) { this.content = content; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } // 请求代码 public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth("token"); headers.add("Header", "header1"); Message message = new Message("hello world 4"); HttpEntity<Message> entity = new HttpEntity<>(message, headers); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("www.example.com"); try { HttpEntity<String> response = restTemplate.exchange( builder.toUriString(), HttpMethod.POST, entity, String.class); System.out.println(response.getBody()); } catch (HttpClientErrorException e) { System.out.println(e.getResponseBodyAsString()); } }
方案2:发送普通文本请求体
如果服务器接受的是普通文本,只需修改Content-Type为文本类型:
public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); // 改为文本类型 headers.setContentType(MediaType.TEXT_PLAIN); headers.setBearerAuth("token"); headers.add("Header", "header1"); String body = "hello world 4"; HttpEntity<String> entity = new HttpEntity<>(body, headers); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("www.example.com"); try { HttpEntity<String> response = restTemplate.exchange( builder.toUriString(), HttpMethod.POST, entity, String.class); System.out.println(response.getBody()); } catch (HttpClientErrorException e) { System.out.println(e.getResponseBodyAsString()); } }
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

