#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 и поддерживает обещания, запросы на выборку будут работать.