@RequestMapping(value = { "/api/v1/test" }, method = { RequestMethod.POST }, produces="application/json;charset=UTF-8") @ResponseBody public String cancelCall(HttpServletResponse rsp) { rsp.addHeader("Access-Control-Allow-Origin", "*"); return "{\"url\":\"http://192.168.1.1/notify\"}"; }
(1)接收数据 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据
(2)输出数据(使用@ResponseBody时) 根据Request对象header部分的Accept属性(逗号分隔),逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter
(3)如果自己完全控制,就直接 resp.setContentType(type); resp.getWriter().write(".."); 即可, 方法返回类型写void,不需要@ResponseBody注解。
(4)用了@ResponseBody,就表示由springMvc来控制如何转换。 <1>输出的Content-Type <2>输出的内容,比如一个Bean转json。
在@RequestMapping指定produces,就指定了输出使用的Content-Type。否则会根据请求的Accept属性挨个去试。
另外,请求的Accept中应该兼容指定的produces, 如果请求的Accept是text/plain,而方法的produces是application/json,那么请求会报错。 如果请求的Accept是*,或者包含application/*,或者包含application/json,那么都是可以的
-----------------------------------------------------------------
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg> <value>UTF-8</value> </constructor-arg> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean>
|