Làm cách nào để chuyển các tiêu đề yêu cầu bằng phương thức getJSON () của jQuery?


76

Tôi cần thực hiện getJSON()yêu cầu, nhưng làm cách nào để chuyển tiêu đề ủy quyền và tùy chỉnh?

Tôi gặp sự cố rằng tiêu đề yêu cầu đang lấy tên, nhưng KHÔNG phải các giá trị. URL đang được hiển thị thông qua một yêu cầu thủ công trong fiddler để được chèn vào dưới dạng tùy chọn thay vì GET / Url.

Đây là một ví dụ về những gì chúng tôi đang cố gắng làm mà hoạt động tốt trong fiddler; làm thế nào tôi có thể sao chép điều này với chức năng 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

Mã 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');
}

Tiêu đề yêu cầu bình thường của 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

Fiddler Through Ajax()Request Headers:

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
Nếu bạn đang làm điều này cho một dịch vụ JSONP, bạn không thể đặt thêm tiêu đề.
Pointy

Câu trả lời:


84

Tôi đồng ý với sunetos rằng bạn sẽ phải sử dụng hàm $ .ajax để chuyển các tiêu đề yêu cầu. Để làm điều đó, bạn sẽ phải viết một hàm cho trình xử lý sự kiện beforeSend, là một trong các tùy chọn $ .ajax (). Dưới đây là một mẫu nhanh về cách thực hiện điều đó:

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

Nếu bạn chạy mã ở trên và xem lưu lượng truy cập trong một công cụ như Fiddler, bạn sẽ thấy hai tiêu đề yêu cầu được chuyển vào:

  • Mã bảo mật có giá trị Foo
  • mật khẩu có giá trị là Bar

Hàm setHeader cũng có thể nằm trong tùy chọn $ .ajax, nhưng tôi muốn gọi nó ra.

Hi vọng điêu nay co ich!


Vui lòng kiểm tra các thay đổi được thực hiện đối với bài đăng gốc (Câu hỏi mới)
Berty

2
Tôi không chắc mình hiểu vấn đề. Khóa / giá trị tiêu đề phải được chuyển tới dịch vụ không phải là một phần của URL mà là các tùy chọn (như bạn đã nói). Bạn sẽ đặt X-PartnerKey và Authorization theo cách ví dụ đặt 'securityCode' và 'passkey' (chỉ là các tiêu đề tôi đã tạo). Máy chủ lưu trữ và Tác nhân người dùng phải được đặt khi bạn thực hiện cuộc gọi $ .ajax. Xin lỗi nếu tôi không hiểu vấn đề một cách chính xác. Nếu bạn có mã nguồn, vui lòng đăng nó và có thể điều đó sẽ giúp ích. Cảm ơn!
David Hoerster

1
Tôi đã thiết lập tiêu đề yêu cầu giống như cách bạn đã làm đối với các ví dụ, nhưng sau khi chạy điều này và xem nó qua trình duyệt, tên của tiêu đề xuất hiện, nhưng không xuất hiện giá trị. Ngoài ra trong fiddler, tôi đang cố gắng thực hiện GET sẽ được hiển thị dưới dạng GET / URL nhưng nếu tôi đặt loại là GET, nó sẽ xuất hiện dưới dạng OPTIONS / URL. Hy vọng điều đó có ý nghĩa hơn. Tôi sẽ đăng mã nguồn nhưng hầu như giống với mã của bạn. Cảm ơn một lần nữa
Berty

Ngoài ra cái này có tương thích với IE và firefox không?
Berty

Có - không có gì cụ thể về mã khiến nó được gắn với IE hoặc FF. Nó phải tương thích với bất kỳ trình duyệt nào hỗ trợ XmlHttpRequest. Tôi đã thử nghiệm trên IE8 & FF 3.5.10.
David Hoerster

39

Tôi nghĩ bạn có thể đặt tiêu đề và vẫn sử dụng getJSON () như thế này:

$.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
Từ tài liệu ( api.jquery.com/jquery.ajaxsetup ): "Việc sử dụng nó không được khuyến khích."
matt cháy

5
@ matt-burn, true. Giải pháp của tôi sẽ khiến mọi yêu cầu ajax jquery có hai giá trị đó trong tiêu đề. Tôi nghĩ trong trường hợp này là vô hại. Bạn có thể gặp phải sự cố nếu bạn đang sử dụng ajaxSetup () để đặt url hoặc loại yêu cầu. Điều đó tôi sẽ không khuyến khích. Vài điều cần lưu ý.
Sean N.

2
Trong trường hợp của tôi, tôi thực sự phải sử dụng cùng một tiêu đề cho tất cả các cuộc gọi getJSON, vì vậy đây là một giải pháp tốt cho tôi :)
marlar

15

Các $.getJSON()phương pháp là viết tắt không cho phép bạn chỉ định tùy chọn nâng cao như thế. Để làm điều đó, bạn cần sử dụng $.ajax()phương pháp đầy đủ .

Lưu ý trong tài liệu tại http://api.jquery.com/jQuery.getJSON/ :

Đây là một hàm Ajax viết tắt, tương đương với:

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

Vì vậy, chỉ cần sử dụng $.ajax()và cung cấp tất cả các thông số phụ mà bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.