HTTP403: ЗАПРЕЩЕНО — сервер понял запрос, но отказывается его выполнять

#javascript #ajax #http-status-code-403

#javascript #ajax #http-status-code-403

Вопрос:

Я продолжаю получать указанную выше ошибку 403 при выполнении AJAX-вызова API.

Ошибка возникает в Microsoft Edge, но не возникает в IE, Chrome, Firefox или Safari.

Страница не использует bootstrap, поскольку я читал, что это может быть вызвано тем, что страница не смогла найти .ТРЕБУЕТСЯ меньше файлов. Я даже пытался включить bootstrap, чтобы посмотреть, решил ли это проблему — этого не произошло.

Похоже, я не могу ничего найти, используя Google, кроме некоторых материалов Twitter Oauth и ответа bootstrap, как указано выше, — оба из которых не имеют отношения к моему приложению.

Как я уже говорил ранее, вызов AJAX отлично работает в любом браузере, КРОМЕ Edge. Код абсолютно одинаков в разных браузерах, а заголовки ответа / запроса совпадают друг с другом — так что это не тот случай, когда POST-запрос отправляет неверные данные (в случае разных настроек браузера по умолчанию или чего-то еще).

Это то, чего я пытаюсь достичь:

index.html содержит 4 iFrames, размещающих рекламу. Затем мой код Javascript выбирает тег iFrame и накладывает значок большого пальца вверх / вниз, где пользователь может предоставить обратную связь для указанных объявлений. Вызову AJAX передается URL-адрес объявления (iFrame src) и идентификатор пользователя (consumer_id). Затем он возвращает идентификатор показа после того, как он записал в базу данных, чтобы записать действие «пальцы вверх / вниз».

Пример кода:

index.html:

 <body>
    <iframe src="https://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1amp;amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA==amp;amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?" width="728" height="90" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" bordercolor="#000000"></iframe>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script type="text/javascript" src="client.js"></script>
</body>
  

Вызов AJAX:

     // This isn't usually a var, but added for clarity. Usually uses a selector 
    // to grab the entire iframe DOM element, and then store in array.    
        var iframe = "http://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1amp;amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA==amp;amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?";

        $.ajax({
            method: 'POST',
            url: 'http://my.api/url/',
            async: false,
            datatype: 'json',
            data: {
                ad_url: iframe, // fetch ad_url from iframe src
                wittel_consumer: "57fcea30f910092a06806344"
            },
            success: function(data, respText, xhr) {
                console.log('Data',data);
                console.log('XHR',xhr);
            },
            error: function(error) {
                console.log('URL',this.url);
                console.log('Error',error);
            }
        });
  

В этом коде выполняется действие AJAX, но возвращается с помощью метода ‘error’. Я вижу, что URL-адрес правильный, и внутри error обратного вызова я просто получаю объект, содержащий подобные readyState: 4, status: 403, statusText: "Forbidden" . Как указано, API действительно работает, поскольку он успешно завершен в любом другом браузере, поэтому должно быть что-то связанное с тем, как Edge обрабатывает запрос. Или это может быть связано с конфигурацией сервера? Я, честно говоря, понятия не имею.

Полная ошибка: HTTP403: FORBIDDEN - The server understood the request, but is refusing to fulfill it.
(XHR)POST - http://my.api/url/

Комментарии:

1. Довольно сложно отлаживать подобные вещи… Но, возможно, попробуйте добавить заголовки к вашему вызову ajax? headers: { 'Content-Type': 'application/json; charset=utf-8' }

2. Да, проверьте заголовки. Если post и header идентичны, то у сервера не будет причин отвечать один раз с помощью forbidden, а в другой раз с надлежащим результатом. Ваш запрос не может быть точно таким же, если он действительно работает в другом браузере, а не просто молча терпит неудачу.

3. Можете ли вы опубликовать полный ajax-запрос, включая заголовок? Еще вы также можете попробовать и сравнить, какой заголовок отправляется на сервер другими браузерами и Edge.

4. Спасибо за ответы, ребята, разобрались. Это было потому, что я выполнял вызов с локального хоста. В прошлом это никогда не представляло для меня проблемы, но я предполагаю, что это как-то связано с конфигурацией API, останавливающей подключения к локальному хосту.

Ответ №1:

Для всех, у кого есть эта проблема:

Я поместил свой код на сервер и оттуда перешел к нему, чтобы проверить, было ли это соединение с локальным хостом — что и было.

API, который я использую, должен быть настроен так, чтобы не разрешать подключения к локальному хосту, чего я никогда раньше не испытывал.

Отличный способ потратить 2 дня и потерять рассудок!

В любом случае спасибо за приведенные выше предложения. Ценю это.

Комментарии:

1. Как это решить, в настоящее время у меня такая же проблема при отправке запросов на localhost.

Ответ №2:

Пожалуйста, укажите учетные данные в параметрах.

 var url = 'https://dummy_url/_api/lists'
var options = {
    headers: {"Accept": "application/json; odata=verbose"},
    credentials: 'include'
}

fetch(url, options).then( 
    res => res.json().then(json => console.dir(json)) 
)
  

Это работает для меня.

Ответ №3:

Попробуйте добавить эти настройки в свой запрос:

 "headers": {
    "Content-Type": "application/json",
    "cache-control": "no-cache",
},
"processData": false,
  

Ответ №4:

Любой другой, кто застрял в этом, и ни один из приведенных выше ответов вам не поможет:

Проверьте свою версию Edge, 17 не поддерживает Promises.

Обновите Windows обновлением за октябрь 2018 года, которое включает Edge 18 и поддерживает обещания, запросы на выборку будут работать.

https://www.microsoft.com/ja-jp/software-download/windows10