【问题标题】:What exactly is a safe method in REST web services?REST Web 服务中的安全方法到底是什么?
【发布时间】:2015-04-06 16:44:41
【问题描述】:

我是 REST 的新手,我对 REST 中的安全方法幂等方法有以下疑问。

我知道(但可能是错误的)GET、HEAD、OPTIONS 和 TRACE 方法被定义为安全的,因为它们仅用于检索数据。

但现在我正在阅读这篇文章:http://restcookbook.com/HTTP%20Methods/idempotency/,它说:

安全方法是不修改资源的 HTTP 方法。为了 例如,在资源 URL 上使用 GET 或 HEAD,永远不要更改 资源。

直到这里还可以,这与我知道的没有什么不同,但是在它断言之后:

然而,这并不完全正确。这意味着:它不会改变 资源表示。仍然有可能,安全的方法可以 更改服务器或资源上的内容,但这不应反映 以不同的表示形式。

这个断言究竟意味着什么?究竟什么是表示?什么是安全的方法在资源上如此更改但这种更改没有反映到不同的表示中?

那么它也做这个例子:

GET /blog/1234/delete HTTP/1.1

并说如果这实际上会删除博文并断言这是不正确的:

安全方法是可以缓存的方法,无需任何预取 对资源的影响。

【问题讨论】:

    标签: web-services rest


    【解决方案1】:

    究竟什么是表示?

    “表示”是从服务器返回的表示对象状态的数据。因此,如果您在http://server/puppy/1 获取它应该返回小狗的“表示”(因为它当然不能返回 实际 小狗。)

    然而,这并不完全正确。这意味着:它不会改变 资源表示。仍然有可能,安全的方法可以 更改服务器或资源上的内容,但这不应反映在 不同的表示。

    这个断言到底是什么意思?

    他们的意思是,如果你 GET /server/puppy/1 连续两次,它应该给你相同的响应。但是,假设您有一个字段,其中包含查看每只小狗的次数。该字段用于提供列出前 10 名观看次数最多的小狗的页面。该信息是通过 GET /server/puppystats 提供的。 GET /server/puppy/1 可以更新该信息。但它不应该更新有关小狗本身的信息。或者,如果它确实更新了关于小狗本身的信息,则该信息不是 GET /server/puppy/1 返回的小狗表示的一部分。它只是可通过另一个 URL 获得的其他一些表示形式的一部分。

    如果有帮助,这与 C++ 中应用于 const 对象的“可变”关键字的概念类似。 “可变”允许您修改对象,但不应以在类外部可见的方式对其进行修改。

    【讨论】:

    • 关于表示,我说我的小狗对象(与 id=1 相关联)状态的 JSON 和 XML 返回日期是相同数据的 2 种不同表示?
    • 我不知道。我在想不同的表示将是引用同一对象的不同字段集。但是,也许改变编码也被认为是一种不同的表现形式。
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2010-11-17
    • 2011-03-13
    相关资源
    最近更新 更多