Изменить заголовки HTTP для запроса JSONP - PullRequest
25 голосов
/ 28 июля 2010

Я использую jquery для создания запроса к API поиска Twitter.Я использую jsonp, так как это необходимо для междоменных запросов.Однако API Twitter указывает, что вы должны установить уникальный User-Agent для этих запросов, и ограничивает ваши запросы, если вы этого не делаете.Проблема в том, что я не вижу способа установить этот заголовок с помощью jquery.

Это код, который я использую:

$.ajax({
    url: 'http://search.twitter.com/search.json',
    dataType: 'jsonp',
    type: 'get',
    data: { q: 'twitter' },
    success: function(data) {
        alert(data.results);
    }
});

Я пытался использовать метод beforeSend, но похоже, чтоэто событие не стрельба.Может кто-нибудь придумать способ решить эту проблему?

Спасибо.

Ответы [ 2 ]

55 голосов
/ 28 июля 2010

JSON с Padding работает путем добавления элемента скрипта на страницу с атрибутом src , указывающим на URL-адрес веб-службы.Затем веб-служба возвращает сценарий, содержащий данные, заключенные в функцию обратного вызова, которая выполняется, когда сценарий завершает анализ.Это не столько JSON (для начала это даже необязательно должен быть действительный JSON), сколько обычный JavaScript.

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

  • XMLHttpRequest Level 2 - Chrome, Safari 4+,Firefox 3.5+, Opera

    // Is XMLHttpRequest Level 2 supported?
    if ("withCredentials" in new XMLHttpRequest()) 
  • XDomainRequest - для IE 8, IE 9

    // Is XDomainRequest supported?
    if ("XDomainRequest" in window)

Itбыло бы неплохо проверить эти реализации, если они существуют, и использовать их соответствующим образом, возвращаясь к стандартному JSONP для неподдерживаемых или более старых браузеров.

Также возможно (но маловероятно, учитывая, что это высокий профиль), что веб-сервис не настроен для разрешения запросов между источниками, поэтому вам все равно придется использовать JSONP в случае сбоя запроса.См. Также Обмен ресурсами между источниками .

0 голосов
/ 27 мая 2014

Попробуйте:

// OAuth configurations   
    var config = {
      'client_id': 'xxxxxx.apps.googleusercontent.com',
      'scope': 'https://www.google.com/m8/feeds/contacts/default/full'          
    };

gapi.auth.authorize(config, function(data) {
      // login complete - now get token
      var token = gapi.auth.getToken();
      token.alt = 'json';
      // retrieve contacts
      jQuery.ajax({
        url: 'https://www.google.com/m8/feeds/contacts/default/full/?max-results=999999',
        dataType: 'jsonp',
        data: token,
        success: function(data) { successGmail(data); }
      });
    });

Я нашел это там: https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J

...