Изменение заголовков HTTP для запроса JSONP

Я использую 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, но, похоже, это событие не срабатывает. Может ли кто-нибудь придумать любой способ решения этой проблемы?

Спасибо.

Ответ 1

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

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

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

Ответ 2

Попробуйте следующее:

// 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