使用表单或表示更新RESTful API中的资源

时间:2013-02-10 10:46:33

标签: json rest xhtml

我看到很多示例,其中XHTML在RESTful API中用于OAuth或OpenID授权。虽然这看起来很自然但我问自己如果还有其他优势,提交表单更好,那么POSTing / PUTing表示资源?我最感兴趣的是机器到机器的交互,然后是人机交互。

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

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

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

问题: 您能否澄清是否存在应该使用表单的情况,或者是否优先于POST资源表示?有官方指导吗?

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

也许我对此缺失了一些东西,所以不要犹豫,把我放在正确的轨道上:)

1 个答案:

答案 0 :(得分:1)

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

1。 购物车是REST客户端状态的一部分,因此您不会将该信息存储在REST服务中。在这种情况下,您可以在客户端或cookie中存储项目和金额,或者在服务器端REST客户端中存储项目和金额,这并不重要。你应该存储项目的网址,项目的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。关于几乎所有内容,还有许多其他解决方案,不仅仅是显示表单,还包括表示数据。您可以通过以下关键词找到更多信息:链接数据,链接的开放数据等......