2010-07-12 35 views
57

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

Tôi gặp sự cố khi tiêu đề yêu cầu lấy tên, nhưng KHÔNG phải là giá trị. URL đang được hiển thị thông qua yêu cầu thủ công trong phần mềm không đượ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 điều đó hoạt động tốt trong fiddler; làm thế nào tôi có thể tái tạo điều này với chức năng AJAX? đang

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 Bình thường Request Headers:

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 Qua Ajax() Headers Yêu cầu:

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 tiêu đề phụ. – Pointy

+0

không chỉ là một json bình thường. – Berty

Trả lời

69

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 ví dụ nhanh về cách để làm đ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 đoạn code trên và xem giao thông trong một công cụ như Fiddler, bạn sẽ thấy hai yêu cầu tiêu đề thông qua tại:

  • Mã bảo vệ với một giá trị của Foo
  • passkey với một giá trị của Bar

chức năng setHeader cũng có thể là nội tuyến trong các tùy chọn $ .ajax, nhưng tôi muốn gọi nó ra.

Hy vọng điều này sẽ hữu ích!

+0

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 có hiểu vấn đề không. 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, nhưng dưới dạng tùy chọn (như bạn đã nói). Bạn sẽ đặt X-PartnerKey và Ủy quyền theo cách thiết lập ví dụ 'securityCode' và 'passkey' (chỉ là các tiêu đề tôi đã tạo). Host và User-Agent nên được thiết lập 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 đề chính xác.Nếu bạn có mã nguồn, hãy đăng nó và có thể điều đó sẽ giúp bạn. Cảm ơn! –

+1

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

12

Phương pháp $ .getJSON() là sho rthand không cho phép bạn chỉ định các tùy chọn nâng cao như vậy. Để làm điều đó, bạn cần sử dụng phương thức $ .ajax() đầy đủ. Lưu ý trong tài liệu tại http://api.jquery.com/jQuery.getJSON/, "Đây là một cách viết tắt Ajax chức năng, đó là 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.

24

Tôi nghĩ rằng bạn có thể thiết lập các 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"); }); 
+2

Từ tài liệu (http://api.jquery.com/jquery.ajaxsetup/): "Không nên sử dụng nó." –

+3

@ matt-burns, đúng vậy. Giải pháp của tôi sẽ gây ra mọi yêu cầu ajax jquery để có hai giá trị đó trong các tiêu đề. Tôi nghĩ trong trường hợp này nó vô hại. Bạn sẽ gặp phải các vấn đề có thể xảy ra nếu bạn đang sử dụng ajaxSetup() để đặt url hoặc kiểu yêu cầu. Rằng tôi sẽ không khuyến khích. Một cái gì đó để nhận thức được. –

+1

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

Các vấn đề liên quan