RESTful 网络服务 - 支持单一内容类型是否违反了任何标准?
RESTful web service - does supporting single content type break any standard?
我满脑子都是下面的问题。我想创建一个使用 XML 数据而不是 JSON 的 RESTful 网络服务(无特殊原因)。
这会违反任何 RESTful 标准吗?
REST 协议不会强制您使用数据的表示格式。实际上,服务器和客户端之间传输的数据格式无关紧要,只要:
- 服务器能够生成请求的格式。
- 客户端能够读取服务器生成的格式。
- 在生成所需格式时不会丢失任何信息(对正在传输的数据 object 至关重要)
这使得使用 JSON 或 XML 成为一种方便的选择(就数据的呈现方式和以后的使用方式而言)。您可以自由选择其中一种格式,甚至另一种格式 - 对于数据的表示方式没有严格的标准。
通常,REST 协议允许(并鼓励)为请求的内容类型提供 headers(通常是 Accepts
,如果您要发送数据,也可以是 Content-Type
)。因此,相同 RESTful 服务应该能够使用任何 有效内容类型。将 RESTful 服务实现为 不可知 内容类型并能够支持多种格式是一个很好的做法。 XML 和 JSON 是最受欢迎和广泛采用的,因此支持两者有点可取。选择任何不同的东西都会导致对您服务的客户(服务的消费者)的限制 - 他们需要识别格式并将其解析为所需数据 object。
此外,还有一种流行的方法是使用基于现有格式的自定义内容类型。因此,通常看到 JSON (application/json
) 而不是 vendor/mycompany.specialformat+json
,即 de-facto JSON 但带有一些元数据(如 API版本控制)嵌入在内容类型中。您甚至可以使用相同的 RESTful 服务生成不同的 JSON 结构,只要将每个不同的表示映射到其自己的内容类型就可以了。例如 vendor/mycompany.specialformat+json
可能呈现相同的 object,但与 vendor/mycompany.anotherformat+json
相比结构不同,但两种格式都是有效的 JSON。
底线是——传输的数据不应该依赖于表示格式。通过 RESTful 服务区分数据 object sent/received 和序列化(格式化)的方式。出于技术原因,您可以选择仅提供一种格式化数据的方式 - 例如 XML。这不会违反任何标准,但会将服务的使用限制为仅 XML-capable 个客户端。另一方面,支持各种格式可能会在 server-side 上引入更多的复杂性,因为可能必须编写额外的逻辑,因为相同的数据应该正确地序列化为新格式。此外,支持各种数据类型是一种让您的服务客户更轻松地请求他们将更轻松地集成的格式的方法 - 是否提供此类功能由您决定。
我满脑子都是下面的问题。我想创建一个使用 XML 数据而不是 JSON 的 RESTful 网络服务(无特殊原因)。
这会违反任何 RESTful 标准吗?
REST 协议不会强制您使用数据的表示格式。实际上,服务器和客户端之间传输的数据格式无关紧要,只要:
- 服务器能够生成请求的格式。
- 客户端能够读取服务器生成的格式。
- 在生成所需格式时不会丢失任何信息(对正在传输的数据 object 至关重要)
这使得使用 JSON 或 XML 成为一种方便的选择(就数据的呈现方式和以后的使用方式而言)。您可以自由选择其中一种格式,甚至另一种格式 - 对于数据的表示方式没有严格的标准。
通常,REST 协议允许(并鼓励)为请求的内容类型提供 headers(通常是 Accepts
,如果您要发送数据,也可以是 Content-Type
)。因此,相同 RESTful 服务应该能够使用任何 有效内容类型。将 RESTful 服务实现为 不可知 内容类型并能够支持多种格式是一个很好的做法。 XML 和 JSON 是最受欢迎和广泛采用的,因此支持两者有点可取。选择任何不同的东西都会导致对您服务的客户(服务的消费者)的限制 - 他们需要识别格式并将其解析为所需数据 object。
此外,还有一种流行的方法是使用基于现有格式的自定义内容类型。因此,通常看到 JSON (application/json
) 而不是 vendor/mycompany.specialformat+json
,即 de-facto JSON 但带有一些元数据(如 API版本控制)嵌入在内容类型中。您甚至可以使用相同的 RESTful 服务生成不同的 JSON 结构,只要将每个不同的表示映射到其自己的内容类型就可以了。例如 vendor/mycompany.specialformat+json
可能呈现相同的 object,但与 vendor/mycompany.anotherformat+json
相比结构不同,但两种格式都是有效的 JSON。
底线是——传输的数据不应该依赖于表示格式。通过 RESTful 服务区分数据 object sent/received 和序列化(格式化)的方式。出于技术原因,您可以选择仅提供一种格式化数据的方式 - 例如 XML。这不会违反任何标准,但会将服务的使用限制为仅 XML-capable 个客户端。另一方面,支持各种格式可能会在 server-side 上引入更多的复杂性,因为可能必须编写额外的逻辑,因为相同的数据应该正确地序列化为新格式。此外,支持各种数据类型是一种让您的服务客户更轻松地请求他们将更轻松地集成的格式的方法 - 是否提供此类功能由您决定。