HTTP GET 设置内部数据,还算 RESTful?
HTTP GET setting internal data, still considered RESTful?
据我了解,HTTP GET 请求应该 return 请求的数据,如果安全(只读)和幂等(无副作用),则被视为 RESTful。
但是,我想实现一项服务来显示自上次使用 /items/userid/new
的 URI 访问以来的新项目,它可以是 RESTful 吗?
当 returning 数据时,应将响应 GET 请求而发送的项目标记为已读,以便跟踪新内容。标记这些项目将违反安全要求和幂等要求。
这是否意味着 .../new
从未被考虑 RESTful?
非常有趣的问题。我认为答案是 "depends on the implementation",因为有不同的解决方案都可以满足业务需求。
如果同一用户每次访问 URL /items/userid/new
都会修改数据库记录,那么它就不是 "safe method" 并且不符合普遍接受的 REST 模式。
如果您过滤视图中的新项目,但每次 GET 调用都没有任何相应的数据库更改,那么它肯定是 RESTful。例如:
/items/userid/new?lastvisit=2015-12-31
或
/items/userid/new?last_id=12345
或者在客户端存储已查看项目的列表肯定符合条件。
通常我们决定 restful 服务并将协议方法关联到它。在 HTTP 的情况下,我们使用 GET、POST、PUT...等。通常使用 Get 获取一些将使用超文本呈现的应用程序状态。
这里/items/userid/new
可以是returns列表中的新服务。在此列表上的任何修改将是具有不同方法关联的后续请求。
跟踪已访问的项目不应该是服务器的责任。客户应该记住已经访问过的项目。这导致更好的可扩展性和松耦合系统,因为服务器不能处理这些参数,例如千名客户。
要提供新鲜的商品,您可以像 Cahit 已经提到的那样,提供一个 Feed,其中包含某个时间范围内的所有商品或固定数量的商品。通常 archived feed 是一个不错的选择。
因此,客户端可以自行抓取您的供稿以检索所有新项目。
确实是个有趣的问题。
对于普通的url,我不会做。例如,一个原因:我记得发送了一封带有唯一 link 指向我们自己的网络服务器的测试邮件。在通过 ISP 的邮件服务器时,向我们的服务器发出了 url 的请求。这是由垃圾邮件过滤器完成的,以检查 url 是否存在。因此,如果邮件被发送到客户说“在这里寻找新商品”,那些甚至在收到邮件之前就会消失。
而且您肯定不希望那个普通的 url 出现在某处的搜索结果中,或用于 预加载 页面。
另一方面,如果请求是在登录期间发出的(或使用 cookie),它可能没问题。
也许这就是我们查看 statistics/responses 时 SO 所做的。
据我了解,HTTP GET 请求应该 return 请求的数据,如果安全(只读)和幂等(无副作用),则被视为 RESTful。
但是,我想实现一项服务来显示自上次使用 /items/userid/new
的 URI 访问以来的新项目,它可以是 RESTful 吗?
当 returning 数据时,应将响应 GET 请求而发送的项目标记为已读,以便跟踪新内容。标记这些项目将违反安全要求和幂等要求。
这是否意味着 .../new
从未被考虑 RESTful?
非常有趣的问题。我认为答案是 "depends on the implementation",因为有不同的解决方案都可以满足业务需求。
如果同一用户每次访问 URL /items/userid/new
都会修改数据库记录,那么它就不是 "safe method" 并且不符合普遍接受的 REST 模式。
如果您过滤视图中的新项目,但每次 GET 调用都没有任何相应的数据库更改,那么它肯定是 RESTful。例如:
/items/userid/new?lastvisit=2015-12-31
或
/items/userid/new?last_id=12345
或者在客户端存储已查看项目的列表肯定符合条件。
通常我们决定 restful 服务并将协议方法关联到它。在 HTTP 的情况下,我们使用 GET、POST、PUT...等。通常使用 Get 获取一些将使用超文本呈现的应用程序状态。
这里/items/userid/new
可以是returns列表中的新服务。在此列表上的任何修改将是具有不同方法关联的后续请求。
跟踪已访问的项目不应该是服务器的责任。客户应该记住已经访问过的项目。这导致更好的可扩展性和松耦合系统,因为服务器不能处理这些参数,例如千名客户。
要提供新鲜的商品,您可以像 Cahit 已经提到的那样,提供一个 Feed,其中包含某个时间范围内的所有商品或固定数量的商品。通常 archived feed 是一个不错的选择。
因此,客户端可以自行抓取您的供稿以检索所有新项目。
确实是个有趣的问题。
对于普通的url,我不会做。例如,一个原因:我记得发送了一封带有唯一 link 指向我们自己的网络服务器的测试邮件。在通过 ISP 的邮件服务器时,向我们的服务器发出了 url 的请求。这是由垃圾邮件过滤器完成的,以检查 url 是否存在。因此,如果邮件被发送到客户说“在这里寻找新商品”,那些甚至在收到邮件之前就会消失。
而且您肯定不希望那个普通的 url 出现在某处的搜索结果中,或用于 预加载 页面。
另一方面,如果请求是在登录期间发出的(或使用 cookie),它可能没问题。
也许这就是我们查看 statistics/responses 时 SO 所做的。