我正在使用Spring的Rest模板将带有数据的请求发布到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);
这是我的服务代码发布方法 -
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对象变为null。 有人可以指出我在这里犯的错误。
答案 0 :(得分:1)
从我的评论中复制:
我猜你的数据是在json格式的请求体上,在request.getReader()中的某个地方...
如何将它作为参数传递,如果你的对象很复杂(在字段中有另一个对象),我认为你不能把它作为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是更好的选择。