1

我看到了许多在 RESTful API 中使用 XHTML 以通过 OAuth 或 OpenID 进行授权的示例。虽然这看起来很自然,但我问自己是否还有其他优势,提交表单比 POST/PUT 资源表示更好?我最感兴趣的是机器对机器的交互,然后是人机交互。

如果我理解得很好,其中一个方面是内容协商,其中 XHTML 表单是否可以返回给客户端(因为默认情况下 JSON 和 XML 不支持表单)取决于Accept请求中的标头。

假设我们有一个简单的场景,Item可以将资源添加到Cart资源中。API 仅支持 JSON 和 XML。我通常做的是我希望客户端对资源POST进行Item资源表示Cart,这很好用。但是客户端应该知道语义并且需要准确地知道Item资源表示的结构,否则它将遇到错误 400(错误请求)。

然后我认为使用表单会更容易,因为它们为客户提供了一些关于将内容发布到Cart. 但是还有一个问题,因为例如 XHTML 支持 OOTB,但 JSON 或 XML 不支持(除非使用 Collection-JSON 等)。然后,我可以提供一些自定义实现以支持 JSON 和 XML 中的表单,但这需要客户端理解语义,并且使用表单而不是发布资源表示没有任何好处

问题: 您能否澄清一下是否存在应该使用表单的场景,或者这种用法比发布资源表示更可取?有官方指导吗?

问题 2: 您是否会费心使用 XHTML 格式的表单,其中 API 和客户端之间的所有通信大多使用 JSON 或 XML,或者您是否会修改 XML/JSON 以包含自定义表单?

也许我错过了一些东西,所以不要犹豫,让我走上正确的轨道:)

4

1 回答 1

1

如果您想将商品添加到购物车,有 2 个选项。

1. 购物车是 REST 客户端状态的一部分,因此您不要将该信息存储在 REST 服务中。在这种情况下,您可以将项目和金额存储在客户端、cookie 或服务器端 REST 客户端中,这并不重要。您应该存储项目的 url、项目的 id 和数量,也许还有价格......所有这些都来自 REST 服务......

2.购物车存储在REST服务中,所以它是一种资源,任何改变都会影响服务的资源状态。在这种情况下,您可以创建一个带有POST /carts请求的购物车,之后您将获得一个唯一的购物车 ID:

201
{
    id: 123,
    _links: {
        self: {href: "/carts/123"}
    }
}

您的客户必须记住这一点,因此,如果您通过目录获得链接模板,例如/items?search=@keywords&cart=@cart.id,您可以在其上填写购物车 ID...

通过浏览目录,您可以通过以下方式获取项目:GET /items?search="red pullover"&cart=123。之后,您将获得add-cart任何项目的链接:

{
    id: 567,
    name: "red pullover",
    _links: {
        "add-cart": {
            href: "/cart-items",
            fields: {
                cart: {type: "hidden", value: 123},
                item: {type: "hidden", value: 567},
                amount: {type: "select", value: 1, min: 1, max: 10}
            }
        }
    }
}

session.cart.id如果客户端中存在该链接,您可以从该链接创建一个表单和一个按钮。如果没有,那么您可以忽略该链接。如果您在生成的表单中按下按钮,它将向服务发送如下内容:

POST /cart-items
{
    cart: 123,
    item: 567,
    amount: 1
}

201
{
    id: 22222,
    _links: {
        self: {href: "/cart-items/22222"}
    }
}

因此,如果您希望您的服务保持 RESTful,您的客户端绝不能生成链接。它总是从服务中获取链接。该服务从不存储客户端状态,客户端状态始终以 queryString 或 postData ...

您可以将 HTML 格式的响应发送到您的 REST 客户端,REST 客户端决定如何处理响应以及如何显示它。最好以数据格式发送响应,例如 HAL+JSON 或 JSON-LD 或 ATOM+XML,因为它们已经存在序列化器和反序列化器。HTML 没有序列化器/反序列化器,只有一个慢速解析器,所以如果你使用 HTML,你必须自己编写那部分代码。

您可以使用 HAL+JSON 找到您自己的表单表示,或者您可以使用现有的模式。JSON-LD 和 ATOM+XML 和 HAL+HTML 可以绑定到现有的 RDF 模式,或者可能绑定到微格式,所以也许有一个关于如何描述表单的模式。您可以浏览已经存在的模式,例如在schema.org上,或者您可以在这里找到已经存在的链接关系:link-relations。几乎所有事情都有许多其他解决方案,不仅仅是关于显示表单,还有关于表示数据。您可以通过关键字找到更多信息:链接数据、链接开放数据等...

于 2013-12-02T09:23:27.013 回答