How can I pass request headers with jQuery's getJSON() method?

I need to do a getJSON() request, but how do I pass authorisation and custom headers?

I am getting issues that the request header is taking the name, but NOT the values. The URL is being shown through a manual request in fiddler to being inserted in as options instead of GET/Url.

Here is an example of what we are trying to do that works fine in fiddler; how can I replicate this with the AJAX function?

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

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 Normal 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 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
128513 次浏览

$.getJSON()方法是一种速记方法,不允许您指定这样的高级选项。为此,您需要使用完整的 $.ajax()方法。

http://api.jquery.com/jQuery.getJSON/文件中的注意事项:

这是一个简写的 Ajax 函数,相当于:

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

So just use $.ajax() and provide all the extra parameters you need.

我同意 Sunetos 的说法,你必须使用 $。函数来传递请求头。要做到这一点,您必须为 before send 事件处理程序编写一个函数,该函数是 $。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 的 securityCode
  • 值为 Bar 的密钥

SetHeader 函数也可以在 $. ajax 选项中内联,但是我想把它调出来。

Hope this helps!

I think you could set the headers and still use getJSON() like this:

$.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"); });