30

I am trying to send a json object using GET method. My code:

$.ajax({
           url: "/api/endpoint",
           type: "GET",
           data: {"sort":"date"},
           contentType: "application/json",
           dataType: "json",
           ...

However, the headers received have "Content-Length" set to zero, hence my json parser on the server doesn't read the content.

I have already tried setting content length header, but it still comes to the server as zero:

$.ajax({
           url: "/api/endpoint",
           headers: {"CONTENT_LENGTH",JSON.stringify({"sort":"date"}).length},
           type: "GET",
           data: {"sort":"date"},
           contentType: "application/json",
           dataType: "json",
           ...

Any idea how to get this working? It HAS to be GET request.

Roman Semko
  • 1,481
  • 5
  • 17
  • 27

4 Answers4

32

GET requests (at least usually) do not have a message body. As mentioned in the docs, jQuery appends data of GET requests to the url parameters. You should be able to read your sort parameter from there with your server application.

BTW, no user agent will allow you to set the Content-Length header - it will (and must) be done automatically depending on the sent data.

Community
  • 1
  • 1
Bergi
  • 513,640
  • 108
  • 821
  • 1,164
22

There are a few places where you have gone a bit wrong.

  • It is not CONTENT_LENGTH, its Content-Length.
  • Do not set Content-Length header, the browser will do it for you.
  • Get request has content-length = 0.

Something like the below should work for you:

$.ajax({
     url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
     type: "GET",
     ...
});
UltraInstinct
  • 38,991
  • 11
  • 73
  • 100
5

I think you should use JSON.stringify for GET parameters in URL like this:

$.ajax({
           url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
           type: "GET",
           contentType: "application/json",
           dataType: "json",
           ...
  • 3
    -1: JSON.stringify may have an `&` which will break the request. Plus, why contentType ? – UltraInstinct Jun 13 '12 at 14:09
  • 3
    I tried this and using contentType: "application/json", dataType: "json", breaks things when you are using json.stringify(), take them out and boom, it works. – ragebunny May 02 '13 at 12:59
4

As mentioned by Bergi, the data is converted by jQuery.ajax() to request parameters. From jQuery 1.7.2:

// Determine if request has content
s.hasContent = !rnoContent.test( s.type );    --> false when s.type == "GET'

...

if ( !s.hasContent ) {
    // If data is available, append data to url
    if ( s.data ) {
        s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
        // #9682: remove data so that it's not used in an eventual retry
        delete s.data;
    }
Iswanto San
  • 17,245
  • 11
  • 56
  • 77
mhu
  • 17,099
  • 10
  • 54
  • 83