选项 Preflight 请求执行 POST 的代码 - 这是标准的吗?
Posted
技术标签:
【中文标题】选项 Preflight 请求执行 POST 的代码 - 这是标准的吗?【英文标题】:OPTIONS Preflight request executes POST's code - is that standard? 【发布时间】:2019-10-07 01:01:42 【问题描述】:如果我理解正确,则会发送一个预检 OPTIONS 请求,以询问“这里允许什么?”。然后,一旦响应到来,如果允许,调用站点就会发送 POST 请求(或 GET,但在我的情况下它是一个帖子)。我发现,至少对于 Azure Function Apps,OPTIONS 请求正在执行我希望只有 POST 才能执行的代码。我相信是这种情况,因为一旦我添加了一些空检查(因为 OPTIONS 请求在正文中没有有效负载),一切正常。
我想知道这是否是标准的。
在我看来,如果我在不使用 Azure Function Apps 的情况下编写了 API,我会沿着一条路径发送 OPTIONS 请求,该路径将设置适当的标头并返回 200 响应。并且 POST 请求将沿着不同的路径发送,该路径期望在正文中有有效负载。如果这就是它通常的工作方式,那么这意味着我刚刚发现了 Azure 功能的特性。但如果不是,这意味着我有一些关于 OPTIONS 预检请求的知识。
提前感谢您的建议。
丹尼斯
【问题讨论】:
这不是标准的。至少就您所描述的而言。不清楚您所说的 “OPTIONS 请求正在执行我希望只有 POST 执行的代码” 的意思——因为事情是,浏览器完全控制 CORS 预检 OPTIONS 请求,并且浏览器从不发送任何请求正文作为该 OPTIONS 请求的一部分。因此,服务器没有请求主体来处理,鉴于此,不清楚您所说的正在执行的代码将消耗什么。换句话说,对于 OPTIONS,服务器只是接收到对具有特定路径的 URL 的请求。 由于此处的字符限制,将澄清作为答案发布。并感谢您的帮助! :-) 【参考方案1】:谢谢大家!对不起,我不清楚。抱歉,我花了一段时间才回来。这方面的事情有点疯狂。
是的,被调用的函数是我的。现在我知道浏览器对于是否进行 OPTIONS 调用没有太多选择。
是的,我可以让我的 Azure 函数以不同方式处理选项调用,也感谢您的建议。这就是我最终要做的事情,但基本上我是通过处理一个空的有效载荷来做到的。我最初没有遵循最佳实践,因为我认为任何有效的请求都会有有效负载。因此,任何没有有效负载的请求都是无效的,应该作为某种失败而被拒绝。这是在我知道 OPTIONS 调用实际上正在执行该函数之前。
我剩下的问题是,如果我没有使用 Azure……如果我推出了自己的解决方案并将其托管在某个地方,我将有一个类或至少有一个方法来处理对这个特定 API 的调用。 (这是我的新手,如果我的条件不太正确,请多多包涵,请纠正我)。因此,如果我完成了自己的 API,我将有一种方法来处理 POST 调用和另一种方法来处理 OPTIONS 调用,不是吗?处理 OPTIONS 调用的方法将返回有关此 API 在法律上可行的信息。处理 POST 调用的方法将处理随它发送的有效负载。并且在发送 OPTIONS 请求时不会执行处理 POST 的方法。至少我是这么认为的。这就是我的问题——当不让 Azure 之类的东西处理某些基础架构时,它是如何完成的?
我只是想了解执行 POST 函数的 OPTIONS 请求是标准做法,还是使用 Azure 函数的某种特质。
再次感谢您的建议并帮助我理解这些问题。
【讨论】:
【参考方案2】:正如sideshowbarker所说,OPTIONS请求是由浏览器自动发送的,以检查是否可以进行跨域请求。
如果是 Azure Functions,这将在云中运行时由 Azure 处理。
如果您的函数被触发,这意味着您将"options"
作为HTTP Trigger 的支持方法
functions.json
中用于非 C# 函数
如果您想自定义 CORS 响应和/或在容器中运行函数,您始终可以将 "options"
包含为支持,并在传入的 HTTP 方法为 OPTIONS 时做出不同的响应。
此外,如果您使用的是Azure API Management with Azure Functions,则可以将 CORS 处理卸载到它,或者甚至使用 Functions Proxies,如 here 所示。
【讨论】:
由于此处的字符限制,将澄清作为答案发布。并感谢您的帮助! :-)以上是关于选项 Preflight 请求执行 POST 的代码 - 这是标准的吗?的主要内容,如果未能解决你的问题,请参考以下文章
Preflight(options) 请求的正确成功状态代码是啥? [复制]