原始资源共享(CORS)发布请求工作

我的本地局域网(machineA)上有一台机器,它有两台Web服务器。 第一个是XBMC内置的(在端口8080上)并显示我们的库。 第二个服务器是一个CherryPy python脚本(端口8081),我用它来根据需要触发文件转换。 文件转换由来自XBMC服务器提供页面的AJAX POST请求触发。

  • 转到显示库的http:// machineA:8080
  • 图书馆被显示
  • 用户点击“转换”链接发出以下命令 -
  • jQuery Ajax请求

    $.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
    
  • 浏览器使用以下标题发出HTTP OPTIONS请求;
  • 请求标题 - 选项

    Host: machineA:8081
    User-Agent: ... Firefox/4.01
    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
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Origin: http://machineA:8080
    Access-Control-Request-Method: POST
    Access-Control-Request-Headers: x-requested-with
    
  • 服务器回应以下内容;
  • 响应标题 - 选项(状态= 200确定)

    Content-Length: 0
    Access-Control-Allow-Headers: *
    Access-Control-Max-Age: 1728000
    Server: CherryPy/3.2.0
    Date: Thu, 21 Apr 2011 22:40:29 GMT
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Content-Type: text/html;charset=ISO-8859-1
    
  • 谈话然后停止。 浏览器在理论上应该发出POST请求,因为服务器使用正确的(?)CORS头(Access-Control-Allow-Origin:*)进行响应
  • 为了解决问题,我还从http://jquery.com发布了相同的$ .post命令。 这是我被困在jquery.com,post请求工作的地方,OPTIONS请求在POST之后发送。 此交易的标题如下所示;

    请求标题 - 选项

    Host: machineA:8081
    User-Agent: ... Firefox/4.01
    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
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Origin: http://jquery.com
    Access-Control-Request-Method: POST
    

    响应标题 - 选项(状态= 200确定)

    Content-Length: 0
    Access-Control-Allow-Headers: *
    Access-Control-Max-Age: 1728000
    Server: CherryPy/3.2.0
    Date: Thu, 21 Apr 2011 22:37:59 GMT
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Content-Type: text/html;charset=ISO-8859-1
    

    请求标题 - POST

    Host: machineA:8081
    User-Agent: ... Firefox/4.01
    Accept: */*
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Referer: http://jquery.com/
    Content-Length: 12
    Origin: http://jquery.com
    Pragma: no-cache
    Cache-Control: no-cache
    

    响应头 - POST(状态= 200确定)

    Content-Length: 32
    Access-Control-Allow-Headers: *
    Access-Control-Max-Age: 1728000
    Server: CherryPy/3.2.0
    Date: Thu, 21 Apr 2011 22:37:59 GMT
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Content-Type: application/json
    

    我无法弄清楚为什么同一个请求可以在一个站点上运行,而不是在另一个站点上运行。 我希望有人能够指出我缺少的东西。 谢谢你的帮助!


    我终于偶然发现了这个链接“一个CORS POST请求从普通的javascript工作,但为什么不用jQuery?” 指出jQuery 1.5.1增加了

     Access-Control-Request-Headers: x-requested-with
    

    头对所有CORS请求。 jQuery 1.5.2不会这样做。 另外,根据同样的问题,设置一个服务器响应头

    Access-Control-Allow-Headers: *
    

    不允许响应继续。 您需要确保响应头特别包含所需的头文件。 即:

    Access-Control-Allow-Headers: x-requested-with 
    

    请求:

     $.ajax({
                url: "http://localhost:8079/students/add/",
                type: "POST",
                crossDomain: true,
                data: JSON.stringify(somejson),
                dataType: "json",
                success: function (response) {
                    var resp = JSON.parse(response)
                    alert(resp.status);
                },
                error: function (xhr, status) {
                    alert("error");
                }
            });
    

    响应:

    response = HttpResponse(json.dumps('{"status" : "success"}'))
    response.__setitem__("Content-type", "application/json")
    response.__setitem__("Access-Control-Allow-Origin", "*")
    
    return response
    

    那么我在这个问题上挣扎了几个星期。

    最简单,最合规,最不危险的方法是使用提供商JavaScript API,该API不会创建基于浏览器的调用,并且可以处理跨源请求。

    例如Facebook JavaScript API和Google JS API。

    如果您的API提供程序不是最新的,并且在其响应中不支持跨源资源源'*'标题,并且没有JS api(是的,我正在谈论关于您的雅虎),那么您会遇到以下三种选项之一 -

  • 在你的请求中使用jsonp,在你的URL中添加一个回调函数,你可以处理你的回应。 注意,这将改变请求URL,所以你的API服务器必须配备处理URL后端的?callback =。

  • 将请求发送到由您控制的API服务器,并且与客户端位于同一个域中,或者启用了跨域资源共享,您可以将请求代理到第三方API服务器。

  • 可能最有用的情况下,你正在做OAuth请求,需要处理用户交互哈哈! window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')

  • 链接地址: http://www.djcxy.com/p/7323.html

    上一篇: origin resource sharing (CORS) post request working

    下一篇: How do I concatenate files in Python?