如何使用 RestTemplate 对 Java 中的复杂 body 的 POST 请求?

How to use RestTemplate for a POST request for a complex body in Java?

我在 Spring 引导项目中使用 RestTemplate,我尝试调用 POST。我正在使用此代码:

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

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "abc@email.com");
map.add("id", "1234567");

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

ResponseEntity<Employ> response = restTemplate.postForEntity(
        "url", request , Employ.class );

现在我想使用 RestTemplate 来处理 POST 请求,但要处理复杂的 object。所以 body 应该是这样的:

{
"SomeThing":{
  "Expr":"cdjhcdjh" 
},
"SomeInfo":{
 "Progr":"EVZpoiuyt",
 "Other": "{code: \"abcd\", password:\"12345\"}"
 }
}

如何为此 body 创建地图?任何反馈将不胜感激。谢谢!

您应该创建 Java 个对象 (POJO),代表您希望通过 RestTemplate 发送的数据。

例如:

public class ObjectToPost {
  private SomeThing someThing;
  private SomeInfo someInfo;

 // getters & setters
}

public class SomeThing {
 private String expr;
     
 // getters & setters
}

public class SomeInfo {
  private String progr;
  private String other;
     
  // getters & setters
}

然后你可以在你的 RestTemplate 中使用这个对象。

ObjectToPost obj = new ObjectToPost();
obj.setSomeThing(...)
obj.setSomeInfo(...)
restTemplate.postForEntity("url", obj , Employ.class);

您也可以使用地图,但这会使它变得相当复杂。如果你真的想用地图实现它,你应该创建一个 <String,Object> 地图,如:

  MultiValueMap<String, Object> map= new LinkedMultiValueMap<String, Object>();
  MultiValueMap<String, MultiValueMap<String, Object>> somethingMap = new LinkedMultiValueMap<String, Object>();
  something.put("SomeThing", Map.of("Expr","cdjhcdjh");
  map.put(somethingMap);

我的建议是使用其他一些 Http 客户端而不是 RestTemplate。所以如果你必须使用 RestTemplate 这个答案是不相关的。我编写了自己的 Http 客户端,虽然它的功能可能有限,但它的主要优点是简单。您的代码可能如下所示:

HttpClient client = new HttpClient();
String response = client.sendHttpRequest("www.myurl.com", HttpClient.HttpMethod.POST, "{\"yourJson\":\"here\"");

这是 HttpClient class. The library can be obtained as Maven artifacts or on Github 的 Javadoc(包括源代码和 javadoc)