- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是网络编程的新手,所以请多多包涵。我在 python flask 中创建了一个简单的 REST API,并使用 Apache 2.4 托管它。我已经通过 cURL 对其进行了测试并且它有效。现在,我正尝试使用 jQuery 通过 Web 界面访问它。
REST API 位于 http://api.localhost访问它的网站位于 http://localhost .
我用来尝试执行 POST 的代码如下所示:
$.ajax({
type: 'POST',
url: 'http://api.localhost/auth',
data: '{"username":"user1", "password":"abcxyz"}',
success: function(data) { console.log(data); alert('data: ' + data); },
contentType: "application/json",
dataType: 'json'
});
但是,成功函数似乎没有运行。在开发控制台 (f12) 中查看,我可以看到不是向该 URL 发送 POST,而是发出了 OPTIONS HTTP 请求。我的理解是这是跨源资源共享 (CORS) 预检检查,以确保本地主机可以访问 api.localhost。
我已将以下行添加到 api.localhost 的 apache 配置中:
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
它似乎正在工作,因为 OPTIONS 请求返回 200(没有其他数据)。但是,没有后续行动。我的理解是,因为服务器说任何人都可以 POST 到 api.localhost,所以它应该继续执行下一步的 POST,但事实并非如此。
以下是预检检查请求 header :
Host: api.localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://localhost
Connection: keep-alive
Cache-Control: max-age=0
以下是同一请求的响应 header (记住,状态 200):
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin: *
Allow: POST, OPTIONS
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=utf-8
Date: Thu, 07 Dec 2017 00:17:08 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.29 (Debian)
Vary: Accept-Encoding
您可以看到服务器说任何域都可以 (*) 并且 POST 是可以的。但是,没有后续的 POST。我错过了什么?
谢谢。
最佳答案
http://api.localhost/auth
还必须发送 Access-Control-Allow-Headers: content-type
。
因此,在您的 Apache 配置中,您还需要添加以下内容:
Header always set Access-Control-Allow-Headers "content-type"
这是必要的,因为前端代码的 contentType: "application/json"
部分向请求添加了一个 Content-Type: application/json
header ,以及任何值对于 Content-Type
请求 header ,而不是 text/plain
、application/x-www-form-urlencoded
或 multipart/form-data
将触发浏览器发送 CORS 预检 OPTIONS
请求。
因此,如果您的 http://api.localhost/auth
服务器发回 Access-Control-Allow-Headers: content-type
响应 header ,那么应该会导致预检成功,从而导致浏览器继续从您的前端代码发出 POST
请求。
关于javascript - 跨域 REST POST 进行预检但不跟进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47685628/
ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限
我正在尝试执行一个小程序,但无法真正完全理解它。在某些地方,我认为它的作用是错误的,但我知道 where =[] 如果有人能指出我正确的方向,我将不胜感激。 import java.util.*; p
感谢您对我上一篇文章的帮助,@AndyE,您的解决方案效果很好。 现在我的后续行动,相同的想法,不同的功能...我尝试实现您之前的解决方案,但无法让它正常工作...: $(document).keyp
我有一个看起来像这样的列表: ('string ', 'time', 'SPY', 0, 0, 131.63, 100), ('sting ', 'time', 'SPY', 0, 0, 131.63
多年来,我们一直在使用 BoundsChecker for Visual C++ 6(我认为它也是 BoundsChecker 5 或 6)。我们已经升级到 VS2008(终于!),现在需要跟进过时的
这是这个问题的后续:Why does a division result differ based on the cast type? 快速总结: byte b1 = (byte)(64 / 0.8f
再次免责声明:我是 Clojure 新手。感谢您的帮助。 我之前的问题 ( Clojure's defrecord - how to use it? ) 产生了一个有效的数据结构和方法:https:/
这是 MySQL count / track streaks or consecutive dates 的后续问题 马特为我之前的问题提供的解决方案效果很好,但现在我遇到了一个问题,因为我正在处理 1
关于问题Multiple delegates per one object?其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛来说):创建一个“委托(delegate)拆分器”,允许一个对象(在本
首先,请阅读我认为我修复了它的旧帖子。 (没时间可以跳过) Firefox interacts with my timers somehow ?!?! This is crazy ^^ 对于那些不想阅
您好,提前谢谢您。这是来自以下线程的跟进问题(不确定我是否应该在那里发布或开始一个新线程......: CSRF token missing or incorrect even though I ha
我之前问过一个问题,根据用户点击这篇文章的哪个链接来填充页面,可以在这里找到: How to populate 1 php page differently depending on link cli
跟进 https://stackoverflow.com/a/3448189 ,实际显示密码屏幕的最佳方式是什么? 我的第一次尝试是使用 LockActivity 启动 SubActivity: //
这是对 How to interpret ggplot2::stat_density2d 的直接跟进. bins已作为参数重新添加 see this thread和 corresponding git
这是 Why is my OpenMP implementation slower than a single threaded implementation? 的后续内容. 我坚持提供的答案,并使用
跟进我之前的问题。 谁能解释为什么下面的代码编译没有任何错误: typedef array MethodArray; typedef array ParameterArray; ParameterAr
按照@AlexWein 在this question 中的建议看着 ProGuard Troubleshooting ,我在 SherlockFragment 中有以下内容: Class c = Cl
这是我之前问过的一个关于计算直手的问题的后续问题......不完全一样......这是读牌的方法 - 它有效 - 但有没有更好的方法 - 做这在 C 中使用控制台输入 ... void read_ca
这是 Previous Question 的跟进 它变得非常复杂,所以我开始一个新线程来使我的观点更清楚。(不想删除以前的线程,因为其他提供有值(value)反馈的人不会失去他们获得的声望点数) 更新
这是对 my previous question 的跟进. 假设我使用以下原型(prototype)编写了一个函数: int a_function(Foo val); 其中 foo 被认为是一个类型定
我是一名优秀的程序员,十分优秀!