SPRING: 无法使用 rest 模板在 post 请求中传递参数
SPRING: Unable to pass parameters in a post request using rest template
我正在使用 Spring 的 Rest 模板 post 向 Web 服务发送数据请求。
这是我的客户端代码片段-
RestTemplate restTemplate = new RestTemplate();
MultiValueMap<String, RequestDefinition> map = new LinkedMultiValueMap<String, RequestDefinition>();
map.add("requestJSON", someDataObject);
MappingJackson2HttpMessageConverter jsonHttpMessageConverter = new MappingJackson2HttpMessageConverter();
restTemplate.getMessageConverters().add(jsonHttpMessageConverter);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
restTemplate.postForObject(someUrl, map, String.class);
这是我的服务器代码post方法-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String reqJSONStr = (String) request.getParameter("requestJSON");
// reqJSONStr is coming as null. No idea why
// some other logic follows here
}
问题是,在我的 servlet post 方法中,requestJSON 对象为空。
有人可以指出我在这里做的错误吗?
从我的评论中复制:
我猜你的数据在 json 格式的请求正文中,在 request.getReader()...[=11= 的某处]
关于如何将其作为参数传递,如果您的对象很复杂(内部有另一个对象作为字段),我认为您无法将所有对象作为 url 参数传递。如果没有,如果您必须将对象作为 url 参数发送,请尝试这样的事情。您还需要逐个读取 servlet 中的对象。
RestTemplate rt = new RestTemplate();
rt.setMessageConverters(
Arrays.asList(new HttpMessageConverter[]{new FormHttpMessageConverter(), new StringHttpMessageConverter()}));
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("some", someDataObject.getSomeProperty().toString());
map.add("another", someDataObject.getAnotherProperty().toString());
String resp = rt.postForObject("http://scooterlabs.com/echo", map, String.class);
System.out.println(resp);
如您所见,没有可以将对象转换为 url 编码参数的 HttpMessageConverter,因此当您将 MappingJackson2HttpMessageConverter 放入转换器列表并尝试添加对象以请求时,它将转换为 JSON 并在请求 BODY 中结束。
就我个人而言,我会将我的 servlet 代码更改为可以从正文中读取 JSON 的代码。如果您尝试发送具有比 url 编码形式更多属性的复杂对象,JSON 是更好的选择。
我正在使用 Spring 的 Rest 模板 post 向 Web 服务发送数据请求。 这是我的客户端代码片段-
RestTemplate restTemplate = new RestTemplate();
MultiValueMap<String, RequestDefinition> map = new LinkedMultiValueMap<String, RequestDefinition>();
map.add("requestJSON", someDataObject);
MappingJackson2HttpMessageConverter jsonHttpMessageConverter = new MappingJackson2HttpMessageConverter();
restTemplate.getMessageConverters().add(jsonHttpMessageConverter);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
restTemplate.postForObject(someUrl, map, String.class);
这是我的服务器代码post方法-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String reqJSONStr = (String) request.getParameter("requestJSON");
// reqJSONStr is coming as null. No idea why
// some other logic follows here
}
问题是,在我的 servlet post 方法中,requestJSON 对象为空。 有人可以指出我在这里做的错误吗?
从我的评论中复制:
我猜你的数据在 json 格式的请求正文中,在 request.getReader()...[=11= 的某处]
关于如何将其作为参数传递,如果您的对象很复杂(内部有另一个对象作为字段),我认为您无法将所有对象作为 url 参数传递。如果没有,如果您必须将对象作为 url 参数发送,请尝试这样的事情。您还需要逐个读取 servlet 中的对象。
RestTemplate rt = new RestTemplate();
rt.setMessageConverters(
Arrays.asList(new HttpMessageConverter[]{new FormHttpMessageConverter(), new StringHttpMessageConverter()}));
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("some", someDataObject.getSomeProperty().toString());
map.add("another", someDataObject.getAnotherProperty().toString());
String resp = rt.postForObject("http://scooterlabs.com/echo", map, String.class);
System.out.println(resp);
如您所见,没有可以将对象转换为 url 编码参数的 HttpMessageConverter,因此当您将 MappingJackson2HttpMessageConverter 放入转换器列表并尝试添加对象以请求时,它将转换为 JSON 并在请求 BODY 中结束。
就我个人而言,我会将我的 servlet 代码更改为可以从正文中读取 JSON 的代码。如果您尝试发送具有比 url 编码形式更多属性的复杂对象,JSON 是更好的选择。