Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

XMLHttpRequest cannot load. No 'Access-Control-Allow-Origin' header is present on the requested resource

#ajax #json #apache #cors #javascript_faq


Добрый день. Есть задача: используя REST API сервиса доставки, описанный здесь, осуществить
запрос стоимости доставки. Для этого нужно открыть сессию(Login), выполнить запрос,
а после закрыть(Logout). Не получается открыть сессию.

Написал js-код для осуществления кросс-доменного запроса и возврата результата. 

$(document).ready(function () {
        $.ajax({
            type: 'POST',
            url: 'http://e-solution.pickpoint.ru/apitest/login',
            crossDomain: true,
            contentType: 'application/json',
            dataType: 'json',
            data: {
                Login: 'apitest',
                Password: 'apitest'
            },
            xhrFields: {
                withCredentials: false
            },
            success: function (status) {
                console.log(status);
            },
            error: function (xhr, status) {
                console.log(xhr);
                console.log(status);
            }
        });
    });


Получаю ошибку в консоли:

XMLHttpRequest cannot load http://e-solution.pickpoint.ru/apitest/login. No 'Access-Control-Allow-Origin'
header is present on the requested resource. Origin '<Адрес моего сайта>' is therefore
not allowed access.


Вывод:

Object {readyState: 0, responseJSON: undefined, status: 0, statusText: "error"}


На основе гугления добавил соответствующие заголовки. Фрагмент файла .htaccess: 


    Header add X-Content-Type-Options nosniff
    Header add Access-Control-Allow-Origin: *
    Header add Access-Control-Allow-Credentials: true
    Header add Access-Control-Allow-Headers: "origin, x-requested-with, content-type"
    Header add Access-Control-Allow-Methods: "PUT, GET, POST, DELETE, OPTIONS"



Так же добавил в начало файла строку:

header("Access-Control-Allow-Origin: *");


Но по-прежнему не получается осуществить запрос. Что делать?
    


Ответы

Ответ 1



Политика безопасности браузеров запрещает выполнение кроссдоменных AJAX запросов. Чтобы это обойти, как было замечено выше нужно добавить заголовок Access-Control-Allow-Origin, но возвращать его должен домен к которому вы обращаетесь. Я так понимаю доступа для изменения настроек у вас к нему нет. Обходится это следующим образом, вы делаете запрос к серверному скрипту, расположенному на вашем сайте, который перенаправляет запрос на нужный сайт.

Ответ 2



Искал тоже самое и наткнулся на ответ SiZE. Всё верно кроме как сделать простенький curl запрос на получение контента, и отдать его в скрипт js больше возможности нет. /** * Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an * array containing the HTTP server response header fields and content. */ function get_web_page( $url ) { $user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0'; $options = array( CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get CURLOPT_POST =>false, //set to GET CURLOPT_USERAGENT => $user_agent, //set user agent CURLOPT_COOKIEFILE =>"cookie.txt", //set cookie file CURLOPT_COOKIEJAR =>"cookie.txt", //set cookie jar CURLOPT_RETURNTRANSFER => true, // return web page CURLOPT_HEADER => false, // don't return headers CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_ENCODING => "", // handle all encodings CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect CURLOPT_TIMEOUT => 120, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects ); $ch = curl_init( $url ); curl_setopt_array( $ch, $options ); $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header; } Пример //Read a web page and check for errors: $result = get_web_page( $url ); if ( $result['errno'] != 0 ) ... error: bad url, timeout, redirect loop ... if ( $result['http_code'] != 200 ) ... error: no page, no permissions, no service ... $page = $result['content']; Источник

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

Отправить комментарий