实现对XML的内容协商支持

在本节中,我们将讨论RESTful Web服务的另一个概念,即内容协商。

内容协商

资源可以具有多种表示形式,主要是因为可能有多个客户端期望不同的表示形式。

内容协商是在存在多种表示形式时选择给定响应的最佳表示形式的过程。它是HTTP的一部分,使得在同一URI下提供不同版本的文档成为可能。

在Web API中,内容协商在服务器端执行,以确定基于客户端请求返回响应的媒体类型格式。内容协商集中在媒体类型和媒体类型格式化程序上。

服务器驱动 vs. 代理驱动的内容协商

位于服务器上的算法会为响应选择表示形式,这称为服务器驱动协商

代理为响应选择表示形式,称为代理驱动的内容协商

因此,大多数REST API实现依赖于代理驱动的内容协商。代理驱动的内容协商依赖于使用HTTP请求资源URI模式

使用HTTP标头进行内容协商

传入的请求可能附带实体。为了确定实体类型,服务器使用HTTP请求标头Content-Type。一些常见的内容类型有:application/json、application/xml、text/html、images/jpg等。

Content-Type: application/xml  

HTTP标头ACCEPT用于确定客户端希望的表示形式类型。它包含与Content-Type中提到的值一致的值。

Accept: application/json  

如果请求中没有标头,服务器可以发送预配置的默认表示类型。

使用URL模式进行内容协商

还有另一种将内容类型信息传递给服务器的方式。客户端可以在资源URI中使用特定扩展名。例如,客户端可以请求以下内容:

http://demo.com/product/mobile/samsung/galaxy-s8/functions.xml  
http://demo.com/product/mobile/samsung/ galaxy-s8/functions.json   

第一个请求URI返回XML响应,第二个URI返回JSON响应。

定义偏好

通过q参数定义偏好,该参数的值在0和1之间。如果客户端没有指定请求标头,则采用隐式值,即1。

如果客户端不确定其所需的表示形式,并希望在接受标头中给出多个值。例如:

Accept: application/json, application/xml;q=0.7,*/*;q=0.5  

上述接受标头允许您请求服务器以JSON格式返回。如果JSON格式不存在,它将寻找XML格式。如果XML格式不可行,就让它返回可能的内容。

到目前为止,我们创建的所有服务都仅使用JSON输入和JSON输出。如果我们想要通过使用HTTP标头application/xml发送GET请求,它将返回状态:406 Not Acceptable

restful-web-services-content-negotiation.png

上面的图片显示XML不是一个有效的接受标头。让我们看看如何将XML格式实现为支持的表示形式之一。

步骤1: 打开 pom.xml 文件并添加 jackson-dataformat-xml 依赖项。

步骤2: 重新启动应用程序。

步骤3: 打开 REST 客户端 Postman 并发送一个指定了HTTP标头 Accept: application/xmlGET 请求。

restful-web-services-content-negotiation2.png

以下图片显示了XML格式的响应。

restful-web-services-content-negotiation3.png

类似地,我们可以发送一个 GET 请求来获取特定用户。

restful-web-services-content-negotiation4.png

让我们使用相同的HTTP标头发送一个 POST 请求。

  • 在标头选项卡下添加 Content-Type: application/xml 和 Accept: application/xml。
  • 选择 Body 选项卡。
  • 以XML格式输入用户的姓名和出生日期。
  • 选择 XML 格式 XML (application/xml)
  • 单击 Send 按钮。

restful-web-services-content-negotiation5.png

我们得到 状态:201 Created。这意味着用户已经成功创建。现在它可以支持XML和JSON两种格式。

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术