【发布时间】:2011-08-22 06:56:59
【问题描述】:
如果你有一个API,仅仅因为URL长度限制和请求中传递复杂的参数而支持POST操作,你还能说你有RESTful架构吗?
以上基本上暗示的是,对于这个特定的(只读)API,GET 和 POST 之间没有语义差异,所以可以用 GET 完成的操作也可以用 POST 完成(但不是反之亦然,由于限制)。
这仍然会使架构的风格成为 RESTful 风格吗?
【问题讨论】:
标签: rest architecture httpverbs
如果你有一个API,仅仅因为URL长度限制和请求中传递复杂的参数而支持POST操作,你还能说你有RESTful架构吗?
以上基本上暗示的是,对于这个特定的(只读)API,GET 和 POST 之间没有语义差异,所以可以用 GET 完成的操作也可以用 POST 完成(但不是反之亦然,由于限制)。
这仍然会使架构的风格成为 RESTful 风格吗?
【问题讨论】:
标签: rest architecture httpverbs
从技术上讲,您没有违反任何约束。但是,您正在严重减少请求的自我描述性。这将导致失去缓存响应的能力。能够缓存响应是构建有效 REST 系统所需的基本功能。
【讨论】:
您肯定会失去 HTTP 为 GET 请求提供的功能。例如,代理对 GET 请求做出某些假设(幂等性、可缓存性)。
POST 本身没有什么问题,但也许 REPORT 方法更合适。
【讨论】:
http://tools.ietf.org/html/rfc5789 你“必须”不仅仅是自己编造的。
所以这里的问题是关于restful架构而不是restful web services。如果我们按照Wiki-RestfulArch-Constraints上提供的信息,是的。
【讨论】:
Roy Fielding 于 2000 年在他的博士论文中引入并定义了 Representational State Transfer 一词。第 6.3 节解释了如何将 REST 应用于 HTTP:http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm#sec_6_3
Fielding 并未声称禁止使用 POST。
维基百科还提到 POST 作为 RESTful Web 服务的合法 HTTP 操作: http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services
【讨论】:
the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action other than retrieval。尊重该声明非常重要。
为什么不直接切换到在 GET 中包含正文而不是使用查询字符串?
RFC 说明如下:
服务器应该 根据任何请求阅读和转发消息正文;如果请求方法 不包括实体主体的定义语义,则 处理请求时应该忽略消息体
规范中没有任何内容 规定不能将主体包含在任何方法中。并且所有代理、服务器等都必须包含正文。是否忽略正文取决于处理程序(您)。
对于 GET 方法,没有任何说明它不能包含正文。
这意味着只要您的网络服务器支持,您就可以使用 GET 正文。
【讨论】:
HttpListener 和 HttpWebRequest,但没有成功。
http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-14#section-7.3“GET 请求上的正文没有定义的语义。请注意,在 GET 请求上发送正文可能会导致某些现有实现拒绝请求。”