Firefox и Internet Explorer не отправляют POST-запрос после получения 200 OK после запроса OPTIONS - отлично работает в Chrome - PullRequest
0 голосов
/ 16 декабря 2018

Я работаю над новым сервисом, в котором REST API встроен в приложение C ++.Приложения C ++ прослушивают определенный порт и получают трафик HTTP / S, обрабатывают то, что отправлено, а затем отправляют ответ HTTP обратно.

Идея состоит в том, что у меня будут разные библиотеки, которые смогут публиковать REST API в C ++ API.Я могу получать запрос из любого места и из любого места, так что это может быть еще одна часть программного обеспечения, например, через CURL, или запрос POST из браузера.

API работал, пока я не работал над библиотекой, которая будет использоваться с Javascript для отправки запроса API C ++ через сообщения AJAX.

Поскольку я делаю пост AJAX с одного веб-сайта на другой домен, мне приходится использовать CORS.Когда я впервые начал проектировать это, я использовал Chrome, и я столкнулся с проблемой, что Chrome отправит запрос HTTP OPTIONS, и я отвечу с помощью метода 403 Not Allowed, так как я не знал об этом в то время.Я посмотрел на это и нашел то, что было нужно, а затем заставил его работать так, чтобы Chrome отправлял запрос OPTIONS, приложение C ++ отправляло 200 OK, а затем Chrome впоследствии отправлял фактический POST AJAX.

Этооднако при полной проверке в Chrome при тестировании в Internet Explorer и Firefox браузер отправляет OPTIONS, а приложение 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

Заголовки запросов Firefox

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

Заголовки ответов Firefox

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);
                }
            }
        });

IЯ использую Jquery для выполнения сообщения AJAX.

Может кто-нибудь понять, почему в этом случае Firefox не будет отправлять фактический запрос после 200 OK, запрос и ответ выглядят одинаково, и это прекрасно работает в Google Chrome.

1 Ответ

0 голосов
/ 21 декабря 2018

Я понял, благодаря комментарию @Manoj Purohit, чтобы снова проверить консоль.Я сделал это и обнаружил, что были отфильтрованы предупреждения, мне пришлось добавить следующий заголовок, чтобы он работал в Firefox и Internet - странно, что это было принято в Chrome.

this->addHeader("Access-Control-Allow-Headers", "authorisation-token, device_id, session_id");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...