春季MVC内容协商
最后修改:2020年12月22日
1.概述
本文介绍如何在Spring MVC项目中实现内容协商。
通常,有三个选项可确定请求的媒体类型:
- 请求中使用URL后缀(扩展)(例如.xml / .json.)
- 在请求中使用URL参数(例如?格式= json)
- 使用接受请求中的头
默认情况下,这是Spring内容协商管理器尝试使用这三种策略的顺序。如果这些都不启用,我们可以指定回退到默认内容类型。
2.内容谈判策略
让我们从必要的依赖开始——我们正在处理JSON和XML表示,所以在本文中,我们将使用Jackson来处理JSON:
<依赖> < groupId > com.fasterxml.jackson。 2.10.2 . com.fasterxml.jackson。 2.10.2 依赖>
对于XML支持,我们可以使用JAXB,XSTREAM或NEWER JACKSON-XML支持。
既然我们已经解释了接受标题较早的文章HttpMessageConverters,让我们专注于深入的前两种策略。
3. URL后缀策略
默认情况下,禁用此策略,但框架可以从URL检查路径扩展,以确定输出内容类型。
在进行配置之前,让我们快速查看一个例子。我们在典型的弹簧控制器中有以下简单API方法实现:
@RequestMapping(value = "/employee/{id}", produces = {"application/json", "application/xml"}, method = RequestMethod.GET) public @ResponseBody employee getEmployeeById(@PathVariable long id) {return employeeMap.get(id);}
让我们调用它使用JSON扩展来指定资源的媒体类型:
卷曲http:// localhost:8080 / spring-mvc-basics / employee / 10.json
如果我们使用JSON扩展,可能会得到以下结果:
{“ID”:10,“名称”:“测试员工”,“ContactNumber”:“999-999-9999”}
下面是使用XML时的请求-响应:
curl http://localhost: 8080 / spring-mvc-basics /员工/ 10. xml
响应机构:
<员工> 999-999-9999 ContactNumber> 10 ID> 测试员工 name> employee>
现在,如果我们不使用任何扩展或使用未配置的一个,返回默认内容类型:
curl http://localhost: 8080 / spring-mvc-basics /员工/ 10
我们现在看看建立此策略 - java和XML配置。
3.1。Java配置
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configuration . favorpatheextension (true)。青少年(假)。ignoreAcceptHeader(真正的)。useJaf(假)。defaultcontenttype(mediatype.application_json);}
让我们仔细阅读细节。
首先,我们启用了路径扩展策略。这也值得一提Spring框架5.2.4,favorPathExtension(布尔)方法被弃用,以阻止在内容协商中使用路径扩展。
然后,我们禁用URL参数策略以及接受标题策略 - 因为我们只想依靠路径延伸方式来确定内容的类型。
然后我们关闭了Java激活框架;JAF可以用作后备机制,如果传入请求与我们配置的任何策略不匹配,则可以选择输出格式。我们正在禁用它,因为我们要将JSON配置为默认内容类型。请注意这Usejaf()方法在Spring Framework 5中已弃用。
最后 - 我们正在将JSON设置为默认值。这意味着如果两个策略都没有匹配,则所有传入请求将被映射到用于JSON的控制器方法。
3.2。XML配置
让我们快速查看相同的完全配置,只使用XML:
<属性名称=“HaintPateExtense”value =“true”/> <属性名称=“pendpparameter”值=“false”/> <属性名称=“ignoreacceptheader”值=“true”/> <属性名称=“defaultContenttype”值=“application / json”/> <属性名称=“defainsjaf”value =“false”/> bean>
4.URL参数策略
我们已经在前一节中使用了路径扩展—现在让我们设置Spring MVC来使用路径参数。
属性的值可以启用此策略有利于分析者属性为true。
让我们快速查看它如何与我们的前一个例子一起使用:
卷曲http:// localhost:8080 / spring-mvc-basics / employee / 10?mediatype = json
这就是JSON响应机构将是什么:
{“ID”:10,“名称”:“测试员工”,“ContactNumber”:“999-999-9999”}
如果我们使用XML参数,则输出将以XML表单为单位:
curl http://localhost: 8080 / spring-mvc-basics /员工/ 10 ? mediaType = xml
响应机构:
<员工> 999-999-9999 ContactNumber> 10 ID> 测试员工 name> employee>
现在让我们进行配置——同样,首先使用Java,然后使用XML。
4.1。Java配置
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configuration . favorpatheextension (false)。favorParameter(真正的)。parameterName(“mediaType”)。ignoreAcceptHeader(真正的)。useJaf(假)。defaultContentType (MediaType.APPLICATION_JSON)。mediaType(“xml”,MediaType.APPLICATION_XML)。mediaType (json, MediaType.APPLICATION_JSON);}
让我们阅读此配置。
首先,当然是路径扩展和接受标题策略被禁用(以及JAF)。
其余配置是相同的。
4.2。XML配置
<属性名称=“pendpparameter”值=“true”/> <属性名称=“parametername”value =“mediatype”/> <属性名称=“defaultContenttype”值=“application / json”/>
此外,我们可以拥有两种策略(扩展和参数)都启用同时:
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configuration . favorpatheextension (true)。favorParameter(真正的)。parameterName(“mediaType”)。ignoreAcceptHeader(真正的)。useJaf(假)。defaultContentType (MediaType.APPLICATION_JSON)。mediaType(“xml”,MediaType.APPLICATION_XML)。mediaType (json, MediaType.APPLICATION_JSON);}
在这种情况下,Spring将首先寻找路径扩展,如果没有,那么将寻找路径参数。如果这两种类型在输入请求中都不可用,那么将返回默认的内容类型。
5.的接受标题策略
如果接受如果启用了头,Spring MVC将在传入请求中寻找它的值,以确定表示类型。
我们必须设定价值Ignoreacceptheader.false来启用这个方法我们禁用了其他两种策略这样我们就知道我们只依赖于接受头。
5.1。Java配置
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configuration . favorpatheextension (true)。青少年(假)。parameterName(“mediaType”)。Ignoreacceptheader(false)。useJaf(假)。defaultContentType (MediaType.APPLICATION_JSON)。mediaType(“xml”,MediaType.APPLICATION_XML)。mediaType (json, MediaType.APPLICATION_JSON);}
5.2。XML配置
<属性名称=“HaintPateExtense”value =“true”/> <属性名称=“pendpparameter”值=“false”/>
最后,我们需要打开内容协商管理器,将其插入到总体配置中:
< mvc:注解驱动content-negotiation-manager = " contentNegotiationManager " / >
6.结论
做完了。我们研究了内容协商在Spring MVC中是如何工作的,并重点介绍了几个设置它以使用各种策略来确定内容类型的示例。
本文的完整实现可以找到在github上。