tags:

views:

106

answers:

2

Original Question

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

New Question

I am getting issues that by using your example that the request header are taking the name, but NOT the values and that 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

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

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 Headings

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

I hope this makes my comments easier to understand

Thanks.

Berty

+2  A: 

The $.getJSON() method is shorthand that does not let you specify advanced options like that. To do that, you need to use the full $.ajax() method. Notice in the documentation at http://api.jquery.com/jQuery.getJSON/ , "This is a shorthand Ajax function, which is equivalent to:"

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

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

sunetos
+2  A: 

I agree with sunetos that you'll have to use the $.ajax function in order to pass request headers. In order to do that, you'll have to write a function for the beforeSend event handler, which is one of the $.ajax() options. Here's a quick sample on how to do that:

<html>
<head>
    <script src="http://code.jquery.com/jquery-1.4.2.min.js"&gt;&lt;/script&gt;
    <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>

If you run the code above and watch the traffic in a tool like Fiddler, you'll see two requests headers passed in:

  • securityCode with a value of Foo
  • passkey with a value of Bar

The setHeader function could also be inline in the $.ajax options, but I wanted to call it out.

Hope this helps!

David Hoerster
Please check changes made to the original post (New Question)
Berty
I'm not sure I understand the problem. The header key/values should be passed up to the service not as part of the URL, but as options (as you said).You would set X-PartnerKey and Authorization the way the example set 'securityCode' and 'passkey' (which were just headers I made up). Host and User-Agent should be set when you make the $.ajax call.Sorry if I'm not understanding the issue properly. If you have source code, please post it and maybe that will help.Thanks!
David Hoerster
I have set up the request headers the same way as you did for the examples, but after running this and viewing it through fiddler the names of the headers appear, but not the values. Also in fiddler i am trying to do a GET which would be displayed as GET/URL but if i set the type to GET it is appearing as OPTIONS/URL. Hope that makes more sense. I will post up source code but is virtually the same as yours. Thanks Again
Berty
Also is this compatible with IE and firefox?
Berty
David Hoerster
You're getting the OPTIONS verb because you're probably requesting the service from a different origin than your site. If you're running through Fiddler, you're site's coming through ipv4.fiddler but you're requesting the service on localhost. My initial example may have been misleading - just request the '.svc' and service method - don't include the 'http://.../' part so that you're requesting the service from the same origin as your site. I updated my example accordingly. Sorry if that caused a problem.
David Hoerster
Sorry that was misleading i was trying both and getting the same affect, if i monitor the request through capture traffic in fiddler and use ipv4.fiddler, in internet explorer i get a 200 and the request comes back fine, if i use firefox i get a 405 error, the differences is that FF is passing it in as OPTIONS, and IE as a GET and that the values for the partnerkey and authentication are not there in FF but fine in IE. Got it working fine in IE but the same code won't work in FF any ideas? Thanks again for your help mate greatly appreciated.
Berty