RESTful API 是一种用于产生和修改资源的软件架构风格。它通过 HTTP 使用资源的唯一标识符来进行交互。然而,RESTful API 还需要进行一种协商机制,以便客户端能够获取服务器支持的格式,并且服务端有机会进行格式更改或版本管理。
什么是数据协商?
数据协商是在客户端和服务器之间进行的,用于确定响应的格式和内容。在 RESTful API 中,协商用于确定使用哪种表示方法。例如,HTTP API 可能支持多个类型的表示方法,例如 HTML、JSON 和 XML。在客户端和服务器之间协商代表响应的格式和内容是十分必要的。
客户端和服务端如何进行数据协商?
RESTful API 使用 HTTP 头部来代表表示要协商的内容。这些头部是 Accept 和 Content-Type。
Accept
Accept 头部用于指示客户端支持的媒体类型和优先级。HEADER Accept:application/json
若 Accept 头部的值没有给出权重(qvalue)参数,则默认权重值为 1。若给出,权重值越大表示越优先。
例如,下面的 Accept 头部指示客户端首选 JSON 和 XML,其中 JSON 的权重为 1,XML 的权重为 0.5:
Accept: application/json;q=1.0, application/xml;q=0.5
如果服务器能够以请求的任何一种格式进行响应,那么它将根据 Accept 头部中的值来决定要使用哪种格式。
Content-Type
Content-Type 头部指示服务器响应的媒体类型。HEAD Content-Type:application/json
例如,如果客户端需要使用 JSON 格式的请求体,并附带相应的 Content-Type 头部:
POST /users HTTP/1.1 Content-Type: application/json { "name": "John" }
表明发送方发送的实体的数据格式和内容。Content-Type 可用于多种类型,不同的值代表不同的数据格式,如application/json, application/xml,application/x-www-form-urlencoded 等。
如果服务端在响应中发送的媒体类型与客户端指定的媒体类型不兼容,则可以使用 406 Not Acceptable 响应。
RESTful API 的数据协商实例
在实际的应用场景中,RESTful API 的数据协商机制会用到各种 HTTP 头部,下面举例说明使用 HTTP 头部让客户端和服务器进行数据协商。
GET 请求实例
以下是 GET 请求,客户端需要服务器返回一个以 JSON 格式表示的列表。如果服务器不能提供所需的格式,则返回包含 406 Not Acceptable 的错误响应。
GET /users HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json [{"name":"John"}, {"name":"Mary"}]
POST 请求实例
以下是 POST 请求,客户端需要向服务器发送一个使用 JSON 格式表示的用户信息。如果请求的格式不是 JSON,则返回包含 415 Unsupported Media Type 的错误响应。
POST /users HTTP/1.1 Content-Type: application/json {"name": "John"}
HTTP/1.1 201 Created Location: /users/123 Content-Type: application/json
{"id": 123, "name": "John"}
406 Not Acceptable 响应
如果服务器无法提供客户端请求的格式,则返回 406 Not Acceptable 状态码。下面是一个示例:
GET /users HTTP/1.1 Accept: application/xml HTTP/1.1 406 Not Acceptable Content-Type: text/plain We cannot produce the requested media type.
415 Unsupported Media Type 响应
如果客户端在请求中使用了不支持的格式,则服务器应该返回 415 Unsupported Media Type 状态码。例如:
POST /users HTTP/1.1 Content-Type: application/pdf HTTP/1.1 415 Unsupported Media Type Content-Type: text/plain The media type is not supported.
总结
数据协商是 RESTful API 中非常重要的一部分,客户端和服务器通过 HTTP 头部进行协商,以确定要使用的媒体类型和版本。合理使用数据协商可以增强 API 的灵活性和可扩展性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64668411968c7c53b070ab1c