jQuery 响应在浏览器中为空,尽管 curl 有效

Posted

技术标签:

【中文标题】jQuery 响应在浏览器中为空,尽管 curl 有效【英文标题】:jQuery response is empty in browser, though curl works 【发布时间】:2011-01-23 20:50:46 【问题描述】:

我正在使用 jQuery 的 .ajax() 调用服务器(实际上是本地 Django 运行服务器)并获得响应。

在服务器控制台上,我可以看到 JSON 请求进来了,他做出了正确的 JSON 响应,一切看起来都正常。

但在我的浏览器中(在 Firefox 3.6 和 Safari 4.0.4 上测试,并且我使用的是 jQuery 1.4.2),似乎响应正文为空(响应代码为 200,其他标题看起来还可以) .

测试来自命令行的响应,我得到了我期望的答案。

$ curl http://127.0.0.1:8000/api/answers/answer/1 --data "text=test&user_name=testy&user_location=testyville&site=http%3A%2F%2Flocalhost%3A8888%2Fcs%2Fjavascript_answer_form.html&email_address=" "answer_permalink": "http://127.0.0.1:8000/questions/1", "answer_id": 16, "question_text": "你小时候的天空是什么样的?", "answer_text": "test", "question_id": "1"

我正在从我的本地计算机上的一个 HTML 文件发出请求,该文件没有由 Web 浏览器提供服务。它只是使用file:// 解决的。 django 服务器也是本地的,默认位置 127.0.0.1:8000。

感谢您的任何建议!

-吉姆

【问题讨论】:

你的 jQuery 是什么样子的? 这是我用来发出请求的页面:dpaste.de/Bbjy jQuery.ajax() 调用是否从浏览器的控制台工作?也可以尝试在import pdb; pdb.set_trace()这一行中折腾。 【参考方案1】:

在您的 .ajax() 调用中将“完成”更改为“成功”。 'complete' 用于在 ajax 操作完成但不提供响应数据时发出信号。 'success' 调用成功的请求并接收响应。 'error' 与 'success' 对应,用于错误处理。

我认为浏览器(至少有些浏览器,例如 Safari,对我而言)根据同源策略将文件系统提供的文件视为受信任的来源。所以结果证明这是一个红鲱鱼。

【讨论】:

【参考方案2】:

添加“error: function(data)alert(data);”以查看您的 $.ajax 是否失败。

【讨论】:

【参考方案3】:

除非您特别允许您的浏览器对本地文件进行备用设置,否则所有内容均受跨域安全策略的约束。不在域中的文件(如localhost)无法从该域请求文件。

我不确定跨域策略如何与端口一起使用;您也许可以将此文件放在可访问端口 80 的 localhost 文件夹中(如果有的话)并完成工作。否则,您会被卡住,除非您可以更改浏览器设置以进行例外处理(即便如此,我也不确定这在任何标准浏览器中是否可行)。

【讨论】:

好的,所以当我将脚本放在 Django 运行服务器内的静态媒体目录中时,响应有效!问题是,发布总是有效的。只有响应是空白的、跨域的,并且仅适用于某些客户端(记住curl 有效)。如果这是跨域安全模型的一部分,我真的不明白。允许我跨域发送数据但不接收响应似乎并不是防止人们陷入麻烦的最佳方式。再说一次,我是前端编码的新手,所以请随时证明我错了。 你是对的 - 这没有任何意义。 (我要指出,curl 不受跨域策略的影响,因为它不在任何域中。)当然,通过 AJAX 进行跨站点通信的真正危险是数据访问。通过 CSRF 自动发送请求很容易通过其他方式实现(例如图像标签、带有自动提交表单的 iframe),因此无论如何都应该在不同的级别上实现对类似攻击的保护。

以上是关于jQuery 响应在浏览器中为空,尽管 curl 有效的主要内容,如果未能解决你的问题,请参考以下文章

尽管覆盖了 onSaveInstanceState,但片段的包在 onCreate 中为空

尽管响应为 200,但 Axios 状态为 449

UnityWebRequest.downloadHandler.text为空,尽管POST方法返回响应

PHP Header Location 响应为空

无法使用 jQuery 在 html 中获取来自 REST Web 服务的 json 响应

如何检测标签在Javascript中为空?