代码之家  ›  专栏  ›  技术社区  ›  Boardy

Firefox和Internet Explorer在收到200个“确定后”选项请求后不发送POST请求-在Chrome中工作正常

  •  8
  • Boardy  · 技术社区  · 7 年前

    我正在做一个新的服务,在这里我有一个内置在C++应用程序中的REST API。C++应用程序侦听特定端口并接收HTTP/S流量,处理发送的内容,然后返回HTTP响应。

    我的想法是,我将拥有不同的库,这些库可以在C++ API中发布REST API。我可以从任何地方或任何地方得到一个请求,所以它可以是另一个软件位,例如通过curl,或者来自浏览器的post请求。

    API工作,直到我在一个与JavaScript一起使用的库中,通过Ajax帖子发送C++ API请求。

    因为我正在做一个从一个网站到另一个域的Ajax文章,所以我必须使用CORS。当我第一次开始设计这个的时候,我使用的是Chrome,我遇到了一个问题,Chrome会发送一个HTTP选项请求,我会用403方法来响应,因为当时我不知道这一点。我调查了这个问题,发现需要什么,然后让它工作,所以Chrome会发送选项请求,C++应用程序会发送一个200 OK,然后Chrome会发送实际的Ajax帖子。

    这完全是在Chrome中工作的,但是,当在Internet Explorer中测试时,Firefox浏览器发送选项,而C++应用程序返回200 OK,但是两个浏览器都不发送实际的POST请求。

    下面是来自chrome和firefox的请求头和响应头。

    Chrome请求头

    Request URL: http://192.168.1.96:500/initialise
    Request Method: OPTIONS
    
    Remote Address: 192.168.1.96:500
    Referrer Policy: no-referrer-when-downgrade
    Provisional headers are shown
    Access-Control-Request-Headers: authorisation-token,device_id,session_id
    Access-Control-Request-Method: POST
    Origin: http://localhost
    User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36
    

    Chrome响应头

        Access-Control-Allow-Headers: * 
        Access-Control-Allow-Methods: POST, OPTIONS 
        Access-Control-Allow-Origin: * 
        Access-Control-Expose-Headers: session_id 
        Allow: POST,OPTIONS 
        Content-Length: 0 
        Content-Type: application/json
        Status Code: 200 OK
    

    火狐请求头

    Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
    Accept-Encoding gzip, deflate
    Accept-Language: en-GB,en;q=0.5
    Access-Control-Request-Headers: authorisation-token,device_id,session_id
    Access-Control-Request-Method: POST
    Connection: keep-alive
    Host: 192.168.1.96:500
    Origin: http://localhost
    Referer: http://localhost/_js/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/64.0
    Request URL:http://192.168.1.96:500/initialise
    Request method:OPTIONS
    Remote address:192.168.1.96:500
    

    火狐响应头

    Access-Control-Allow-Headers: *
    Access-Control-Allow-Methods: POST, OPTIONS
    Access-Control-Allow-Origin: *
    Access-Control-Expose-Headers: session_id
    Allow: POST,OPTIONS
    Content-Length: 0
    Content-Type: application/json
    Status code:200
    

    以下是我如何执行Ajax请求的参考:

    var url = "http://192.168.1.96:500/";
            url += api_endpoint;
    
            $.ajax({
                type: "POST",
                url: url,
                async: true,
                headers: {
                    "authorisation-token": app.api_key,
                    "session_id": app.cookie,
                    "device_id": app.device_id
                },
                data: postArray,
                crossDomain: true,
                success: function(object, status, xhr){
                    if (api_endpoint === "initialise")
                    {
                        app.cookie = xhr.getResponseHeader("session_id");
                        setCookie("session_id", app.cookie, true);
                    }
                    if (callbackResult !== null)
                    {
                        callbackResult(object);
                    }
                },
                error: function(xhr)
                {
                    console.error("Status: " + xhr.status);
                    console.error("Status Text:" + xhr.statusText);
                    console.error("Response Text: " + xhr.responseText);
                    if (callbackResult !== null)
                    {
                        callbackResult(xhr);
                    }
                }
            });
    

    我正在使用jquery执行Ajax发布。

    有人知道为什么在这种情况下,火狐不会在200OK之后发送实际的请求,请求和响应看起来是相同的,这在Google Chrome中非常有效。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Boardy    7 年前

    多亏了@manoj purohit的评论,我才发现再次检查控制台。我这样做了,发现有一些警告被过滤掉了,我必须添加下面的标题,使它在Firefox和Internet中工作-尽管它在Chrome中被接受,但很奇怪。

    this->addHeader("Access-Control-Allow-Headers", "authorisation-token, device_id, session_id");