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

Благодарю.

2 ответа

Решение

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

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

  • XMLHttpRequest Уровень 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 в случае сбоя запроса. Смотрите также, Обмен ресурсами между источниками.

Попробуй это:

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

Другие вопросы по тегам