setRequestHeader не работает в JSONP с использованием jQuery

Я создаю приложение для iPhone, используя jQuery Mobile, jQuery 1.7.2 и PhoneGap.

пытаясь получить JSONP из веб-службы ASP.NET RESTful, используя этот код, проблема в том, что мне нужно сначала пройти аутентификацию и получить токен, а затем отправить его обратно.

вот моя функция:

var setToken = function () {
    var serverToken = '';
    $.support.cors = true;
    jQuery('body').ajaxSend(function (evt, xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode(username + ":" + password));
        xhr.setRequestHeader('X-Accept', 'application/json');
    });
    $.getJSON(url + "?jsoncallback=?", null, function (res) {
        console.log(res);
        serverToken = res.Token;
    });

    $('body').ajaxSend(function (evt, xhr, ajaxOptions) {
        xhr.setRequestHeader('NewToken', serverToken);
    });

};

Я получаю 401 (Неавторизованный) проверил заголовок:


    Request URL:http://192.168.0.44/call/?jsoncallback=jQuery17206244203052483243499_132336710607307&_=1336742104278
    Request Method:GET
    Status Code:401 Unauthorized

    Request Headers
    Accept:*/*
    Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:en-US,en;q=0.8
    Connection:keep-alive
    Host:192.168.0.44
    Referer:http://localhost/myMobileApp/
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19
    Query String Parametersview URL encoded
    jsoncallback:jQuery17206244203052483243499_132336710607307
    _:1336710704278

    Response Headers
    Access-Control-Allow-Origin:*
    Cache-Control:private
    Content-Length:0
    Date:Fri, 11 May 2012 04:31:52 GMT
    Server:Microsoft-IIS/7.5
    WWW-Authenticate:Basic
    X-AspNetMvc-Version:3.0
    X-Powered-By:ASP.NET

setRequestHeader не добавил заголовки.

Что я делаю не так?

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

заранее спасибо


person EMMNS    schedule 11.05.2012    source источник


Ответы (2)


Как говорит jfriend00,

Запрос JSONP не использует фактический вызов ajax, где вы можете управлять HTTP-запросом.

Однако в вашем случае заголовок, который вы пытаетесь добавить, является базовой авторизацией, вы можете просто вставить его в URL-адрес, как вы это обычно делаете. Таким образом, для аутентификации на http://example.com с пользователем "user" и паролем "pass" URL-адрес будет http://user:[email protected]/.

person AKX    schedule 11.05.2012
comment
Я предполагаю, что тогда setRequestHeader не может работать с вызовами JSONP, поэтому я использовал метод инъекции, и он отлично сработал, всем спасибо за помощь. - person EMMNS; 11.05.2012
comment
URL-адрес будет user:[email protected] не разрешен в браузере IE support.microsoft.com/en-in/kb/834489, есть ли у вас предложения, как получить аутентификацию заголовка для jsonp без передачи URL? - person magento2new; 22.12.2016

Запрос JSONP не использует фактический вызов ajax, где вы можете управлять HTTP-запросом.

Вместо этого он вставляет тег скрипта на вашу страницу, а затем браузер запрашивает этот файл src скрипта. Результирующий сценарий, который возвращается, выполняется и передает результат через выполнение этого javascript (вызывая функцию обратного вызова). Поскольку запрос генерируется с помощью вставки тега скрипта, а не прямого вызова ajax, невозможно установить заголовки запроса в запросе JSONP.

Если ваш запрос является междоменным, то JSONP — ваш единственный механизм.

Если ваш запрос имеет тот же источник, что и страница (не междоменный), вы можете реструктурировать свой запрос, чтобы он был фактическим вызовом ajax, который возвращает данные JSON. Если бы вы это сделали, вы могли бы установить заголовки запроса на вызов ajax.

person jfriend00    schedule 11.05.2012
comment
спасибо, теперь я действительно понимаю, как работает JSONP, и да, это междоменный вызов, поэтому мне нужно использовать JSONP :-( - person EMMNS; 11.05.2012