【问题标题】:Serving all REST requests over GET with Tornado使用 Tornado 通过 GET 服务所有 REST 请求
【发布时间】:2013-01-13 10:31:42
【问题描述】:

我有一个 REST(或几乎是 REST)网络 API,
我希望 API 用户能够使用所有 api,即使由于某种原因只能进行 GET 调用,所以计划是接受一个 url 参数(查询字符串),如 request_method,它可以是 GET(默认)或 POST、PUT、DELETE,我想路由它们。

我的问题不是标准的请求处理程序覆盖和检查get(self) 方法中的每个 httpRequestHandler,如果这是一个 POST、PUT、DELETE 和调用适当的函数,是有没有办法以更一般的方式执行此“路由”,例如在应用程序定义中的 URL 模式或覆盖路由功能或其他什么?

为了清楚,这些请求都是通过带有参数的 GET 来的,例如 ?request_method=POST

感谢任何建议。

可能的解决方案:

  • 只有一个“.*” url 模式并在单个 RequestHandler 中处理所有路由。应该可以正常工作,除了我不会利用 Tornado 的 url 模式匹配功能。

  • 在所有请求处理程序中的所有get(self)方法中添加if,并检查该请求是否应由get处理,如果不是,则调用相关方法。

【问题讨论】:

  • 一旦您绕过标准的GETPOSTPUTDELETE 功能,您就不再拥有 ReSTful API。仅针对框架的上下文,有一些很好的答案here。 API 用户会被限制为GET 请求的一些原因是什么?
  • 我认为提供 GET 替代方案的原因有很多,其中之一是如果人们想要进行跨域 JSONP 调用,而 POST 则无法实现。

标签: python rest get tornado url-pattern


【解决方案1】:

这将是一件非常愚蠢的事情。 Chrome 和 Firefox 以及许多其他 Web 用户代理都会推测性地获取 (GET) 页面上的部分或全部链接,包括您的 request_method=DELETE URL。您会发现您的数据库已被清空,只是因为有人环顾四周。不要故意破坏 HTTP。 GET 被定义为一种“安全”的方法,这意味着可以获取任何你喜欢的 URL,并且不会发生任何不好的事情。

EDIT为处于类似情况的其他人:
OP 说他正在使用 JSONP 并控制 API 服务器和客户端 Web 应用程序。在这种情况下,理想的解决方案是Cross-Origin Resource Sharing(CORS,spec),尽管该技术需要 IE8+、Firefox 3.5+、Safari 4+ 或 Chrome 3+。如果您需要针对较早的浏览器,并且您控制两个域,我建议至少为您自己的客户端 Web 应用程序合并两个域的内容。 api 域可以保留给外部客户端,但它们会受到 CORS 浏览器要求的限制。

【讨论】:

  • 谢谢,我明白这一点,以及与机器人和爬虫类似的问题,但他原来的问题的解决方案是什么?不能跨域进行post jsonp调用。
  • JSONP 是一种死胡同技术。你能多解释一下这两个网站吗?哪个 API 是你的(或者它们都是你的?)。不能用 CORS 代替吗?
  • API server 和 web app 都是我们的,我主要负责 API 端。
  • 太好了,然后you can use CORS 允许来自 Web 应用程序域的 API 服务域上的请求。这允许使用所有 HTTP 方法,并且您不必维护 JSONP 请求和 Javascript 回调函数之间的耦合。我不知道它在 Python 中是如何工作的,但是如果您使用的是 jQuery,则在返回数据时将执行 AJAX jqXHR.success() 方法。把你的 JSONP 函数代码放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多