如何使用jQuery的getJSON()方法传递请求标头?


76

我需要发出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服务执行此操作,则无法设置额外的标头。
尖尖的

Answers:


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的securityCode
  • 带有Bar值的密码

setHeader函数也可以内联到$ .ajax选项中,但我想将其调出。

希望这可以帮助!


请检查到原来的职位(新课题)所做的更改
BERTY

2
我不确定我是否理解问题。标题键/值不应作为URL的一部分,而应作为选项(如您所说)传递给服务。您将按照示例设置“ securityCode”和“ passkey”(这只是我编写的标头)的方式设置X-PartnerKey和Authorization。调用$ .ajax时,应设置主机和用户代理。抱歉,如果我无法正确理解问题。如果您有源代码,请发布它,也许会有所帮助。谢谢!
David Hoerster,2010年

1
我已经按照与示例相同的方式设置了请求标头,但是在运行并通过提琴手查看请求标头后,将显示标头的名称,而不显示值。同样在小提琴手中,我试图做一个将显示为GET / URL的GET,但是如果我将类型设置为GET,它将显示为OPTIONS / URL。希望这更有意义。我将发布源代码,但实际上与您的源代码相同。再次感谢
Berty 2010年

这也与IE和Firefox兼容吗?
Berty 2010年

是的-关于将其绑定到IE或FF的代码没有具体规定。它应该与任何支持XmlHttpRequest的浏览器兼容。我在IE8和FF 3.5.10上进行了测试。
David Hoerster,2010年

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,是的。我的解决方案将导致每个jquery ajax请求在标头中都具有这两个值。我认为在这种情况下,它是无害的。如果您使用ajaxSetup()设置URL或请求类型,则可能会遇到问题。我会劝阻的。有一点要注意。
肖恩·N.14年

2
就我而言,我实际上必须对所有getJSON调用使用相同的标头,所以这对我来说是一个很好的解决方案:)
marlar

15

$.getJSON()方法是简写,不允许您指定类似的高级选项。为此,您需要使用完整$.ajax()方法。

请注意http://api.jquery.com/jQuery.getJSON/上的文档:

这是Ajax的简写功能,等效于:

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

因此,只需使用$.ajax()并提供所需的所有其他参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.