【发布时间】:2013-11-05 21:33:55
【问题描述】:
我有一个基于cherrypy 的简单python web 服务器。其资源应提供 API。服务端有如下代码提供CORS:
def CORS():
cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"
if __name__ == "__main__":
cherrypy.tools.CORS = cherrypy.Tool('before_finalize', CORS)
cherrypy.quickstart(PyCachedAdmin(), config={'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}})
服务器在 localhost:8080 上运行。现在我有一个 HTML 文件,在加载 jquery 1.9 的 localhost(默认端口 80)上可用。我打开浏览器控制台尝试使用$.ajax 对cherrypy 服务器执行任何AJAX 请求。我一直在尝试:
$.ajax({
url:'http://localhost:8080/',
type: "POST",
dataType: "json",
data: {command:"version"}
}).done(function(){
console.log('hej');
});
和
$.ajax({
url:'http://localhost:8080/',
type: "POST",
crossDomain: true,
dataType: "jsonp",
data: {command:"version"}
}).done(function(){
console.log('hej');
});
和
$.support.cors = true
没有任何效果。我在使用 jsonp 时得到XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 或GET http://localhost:8080/?callback=jQuery19102827550224028528_1382823727186&command=version&_=1382823727187 404 (Not Found)(它发送 GET 而不是 POST 很神秘)。周围有一些类似的问题,我试过了,这些是我的结果(仍然有问题)。
PS 服务器完全没问题,因为所有 curl 测试都通过了。跨域的东西有问题。
【问题讨论】:
-
什么是“浏览器”?
-
它是 chrome 27.0.1453.93
-
crossDomain: true 和 $.support.cors = true 绝对不需要,除非您的服务器返回 jsonp(此时您不需要 cors),否则您不需要 jsonp。也无法发送 POST jsonp 请求,因为 jsonp 是使用脚本标签而不是 xhr 发送的。您的第一个 sn-p 是正确的。您可以发布正在发送的请求和响应标头吗? (铬控制台)
-
@KevinB 但是当我执行
$.ajax({ url:'http://localhost:8080/', type: "POST", data: {command:"version"} }).done(function(){ console.log('hej'); });时出现错误:XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. -
没关系。但做出任何这些改变都不会改变结果。你的javascript很好。问题更可能是浏览器权限(不太可能)或服务器没有正确处理 cors 请求。
标签: javascript jquery python cors cherrypy