2012-06-08 9 views
24

Ich versuche, ein Json-Objekt mit GET-Methode zu senden. Mein Code:JQuery, senden JSON-Objekt mit GET-Methode

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

jedoch die Header erhalten hat "Content-Length" auf Null gesetzt, daher meinen Json-Parser auf dem Server liest nicht den Inhalt.

Ich habe bereits versucht, Inhalte Length-Header Einstellung, aber es kommt immer noch auf den Server als Null:

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

Jede Idee, wie diese Arbeit zu bekommen? Es muss GET-Anfrage sein.

+0

GET-Anfrage nicht Inhalt ??? – Bergi

+0

Inhaltslänge ist irrelevant, weil Sie keine Anfrage mit einem Körper stellen. Wie liest du die Anfrage? – Esailija

+3

Haben Sie überprüft, wie Ihre Anfrage aussieht (z. B. im Tab Firebug - Net)? – Dusan

Antwort

27

GET-Anfragen (at least usually) haben keinen Nachrichtentext. Wie in the docs erwähnt, fügt jQuery data von GET-Anforderungen an die URL-Parameter an. Sie sollten Ihren sort Parameter von dort mit Ihrer Serveranwendung lesen können.

BTW, kein Benutzer-Agent können Sie die Content-Length Header festlegen - es wird (und muss) automatisch in Abhängigkeit von den gesendeten Daten erfolgen.

4

Ich glaube, Sie JSON.stringify für GET-Parameter in URL wie folgt verwendet werden soll:

$.ajax({ 
      url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}), 
      type: "GET", 
      contentType: "application/json", 
      dataType: "json", 
      ... 
+3

-1: JSON.stringify kann ein '&' enthalten, wodurch die Anfrage abgebrochen wird. Und warum contentType? – SuperSaiyan

+3

Ich habe dies versucht und mit contentType: "application/json", dataType: "json", bricht Dinge, wenn Sie json.stringify() verwenden, nehmen Sie sie heraus und boom, es funktioniert. – ragebunny

3

Wie Bergi erwähnt, die Daten von jQuery.ajax() umgewandelt wird, um Parameter zu beantragen. Von 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; 
    } 
20

Es gibt ein paar Orte, wo man etwas falsch gelaufen.

  • Es ist nicht CONTENT_LENGTH, seine Content-Length.
  • Setzen Sie nicht Content-Length Header, der Browser wird es für Sie tun.
  • Get-Anfrage hat content-length = 0.

So etwas wie die unten sollte für Sie arbeiten:

$.ajax({ 
    url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})), 
    type: "GET", 
    ... 
});