Як я можу передати заголовки запитів за допомогою методу jQuery getJSON ()?


76

Мені потрібно зробити a getJSON() запит, але як мені пройти авторизацію та власні заголовки?

Я отримую проблеми з тим, що заголовок запиту бере ім’я, але НЕ значення. URL-адреса відображається через ручний запит у скрипті для вставки як опцій замість GET / Url.

Ось приклад того, що ми намагаємось зробити, що добре працює у скрипті; як я можу відтворити це за допомогою функції AJAX?

GET /Service.svc/logins/gdd53535342/houses/vxcbdfsdg/people/dsgsdggd?format=json HTTP/1.1
User-Agent: Fiddler
Authorization: Basic rgbg423535fa23y4436
X-PartnerKey: df3fgeg-g5g6-b55b-f3d2-dsgg353523
Host: 154.34.53.54:2757

Код JavaScript:

xhr = new XMLHttpRequest();

$(document).ready(function() {
  $.ajax({
    url: 'http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json',
    type: 'GET',
    datatype: 'json',
    success: function() { alert("Success"); },
    error: function() { alert('Failed!'); },
    beforeSend: setHeader       
  });   
});

function setHeader(xhr) {
  xhr.setRequestHeader('Authorization', 'Basic faskd52352rwfsdfs');
  xhr.setRequestHeader('X-PartnerKey', '3252352-sdgds-sdgd-dsgs-sgs332fs3f');
}

Звичайні заголовки запиту Fiddler:

GET /service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1
User-Agent: Fiddler
Authorization: Basic faskd52352rwfsdfs
X-PartnerKey: 3252352-sdgds-sdgd-dsgs-sgs332fs3f
Host: localhost:437

Скрипт через Ajax()заголовки запитів:

OPTIONS service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1
Host: localhost:437
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Proxy-Connection: keep-alive
Origin: http://ipv4.fiddler:61975
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization,x-partnerkey

1
Якщо ви робите це для служби JSONP, ви не можете встановити додаткові заголовки.
Пойнті

Відповіді:


84

Я погоджуюсь з sunetos, що вам доведеться використовувати функцію $ .ajax, щоб передавати заголовки запитів. Для цього вам доведеться написати функцію для обробника події beforeSend, яка є однією з опцій $ .ajax (). Ось короткий зразок того, як це зробити:

<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $.ajax({
          url: 'service.svc/Request',
          type: 'GET',
          dataType: 'json',
          success: function() { alert('hello!'); },
          error: function() { alert('boo!'); },
          beforeSend: setHeader
        });
      });

      function setHeader(xhr) {
        xhr.setRequestHeader('securityCode', 'Foo');
        xhr.setRequestHeader('passkey', 'Bar');
      }
    </script>
  </head>
  <body>
    <h1>Some Text</h1>
  </body>
</html>

Якщо запустити наведений вище код і спостерігати за трафіком у такому інструменті, як Fiddler, ви побачите два передані заголовки запитів:

  • код безпеки зі значенням Foo
  • ключ доступу зі значенням Bar

Функція setHeader також може бути вбудованою в опції $ .ajax, але я хотів її викликати.

Сподіваюся, це допомагає!


Будь ласка, перевірте зміни, внесені до оригінального повідомлення (Нове запитання)
Берті,

2
Я не впевнений, що розумію проблему. Ключі / значення заголовка повинні передаватися службі не як частина URL-адреси, а як параметри (як ви вже сказали). Ви б встановили X-PartnerKey та Authorization так, як у прикладі встановлено 'securityCode' та 'passkey' (які були лише заголовками, які я склав). Хост і User-Agent повинні бути встановлені під час здійснення виклику $ .ajax. Вибачте, якщо я не розумію проблему належним чином. Якщо у вас є вихідний код, надішліть його, і, можливо, це допоможе. Дякую!
David Hoerster

1
Я встановив заголовки запитів так само, як і ви для прикладів, але після запуску цього і перегляду через скрипт з'являються імена заголовків, але не значення. Крім того, у скрипті я намагаюся зробити GET, який відображався б як GET / URL, але якщо я встановив тип GET, він відображається як OPTIONS / URL. Надія, що має більше сенсу. Я опублікую вихідний код, але він фактично такий же, як і ваш. Ще раз спасибі
Берті

Також це сумісно з IE та firefox?
Берті

Так - у коді немає нічого конкретного, що робить його прив’язаним до IE або FF. Він повинен бути сумісним з будь-яким браузером, який підтримує XmlHttpRequest. Я тестував на IE8 & FF 3.5.10.
Девід Хоерстер,

39

Я думаю, ви могли б встановити заголовки і все одно використовувати getJSON () так:

$.ajaxSetup({
  headers : {
    'Authorization' : 'Basic faskd52352rwfsdfs',
    'X-PartnerKey' : '3252352-sdgds-sdgd-dsgs-sgs332fs3f'
  }
});
$.getJSON('http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json', function(json) { alert("Success"); }); 

4
З документів ( api.jquery.com/jquery.ajaxsetup ): "Його використання не рекомендується."
Метт горить

5
@ matt-burns, правда. Моє рішення призведе до того, що кожен запит ajax jquery матиме ці два значення в заголовках. Я думаю, що в цьому випадку це нешкідливо. Ви могли б зіткнутися з проблемами, якби використовували ajaxSetup () для встановлення URL-адреси або типу запиту. Що я б знеохочував. Щось, про що слід знати.
Шон Н.

2
У моєму випадку я насправді повинен використовувати один і той же заголовок для всіх викликів getJSON, тому це прекрасне рішення для мене :)
marlar

15

Цей $.getJSON()метод є скороченим, що не дозволяє вказати такі додаткові параметри. Для цього потрібно використовувати повну$.ajax() метод.

Примітка в документації за адресою http://api.jquery.com/jQuery.getJSON/ :

Це скорочена функція Ajax, яка еквівалентна:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Тож просто використовуйте $.ajax()та надайте всі необхідні додаткові параметри.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.