2012-06-08 17 views
24

Sto tentando di inviare un oggetto JSON utilizzando il metodo GET. Il mio codice:JQuery, invia oggetto JSON utilizzando il metodo GET

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

Tuttavia, le intestazioni ricevute sono "Content-Length" impostato a zero, da qui la mia JSON parser sul server non legge il contenuto.

Ho già provato a fissare intestazione lunghezza del contenuto, ma si tratta comunque al server come zero:

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

Qualsiasi idea di come ottenere questo lavoro? Deve essere GET richiesta.

+0

richiesta GET non hanno contenuti ??? – Bergi

+0

La lunghezza del contenuto è irrilevante poiché non si effettua una richiesta con un corpo. Come stai leggendo la richiesta? – Esailija

+3

Hai controllato come appare la tua richiesta (ad esempio nella scheda Firebug - Net)? – Dusan

risposta

27

Le richieste GET (at least usually) non hanno un corpo del messaggio. Come menzionato in the docs, jQuery aggiunge data di richieste GET ai parametri dell'URL. Dovresti essere in grado di leggere il tuo parametro sort da lì con la tua applicazione server.

BTW, nessun agente utente consente di impostare l'intestazione Content-Length - sarà (e deve) essere eseguita automaticamente in base ai dati inviati.

4

Credo che si dovrebbe utilizzare JSON.stringify per i parametri GET in URL simile a questo:

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

-1: JSON.stringify potrebbe avere un '&' che interromperà la richiesta. Inoltre, perché contentType? – SuperSaiyan

+3

Ho provato questo e usando contentType: "application/json", dataType: "json", rompe le cose quando si utilizza json.stringify(), estrarle e boom, funziona. – ragebunny

3

Come accennato dal Bergi, i dati vengono convertiti da jQuery.ajax() per richiedere i parametri. Da 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

Ci sono alcuni posti in cui si è andati un po 'sbagliato.

  • Non è CONTENT_LENGTH, è Content-Length.
  • Non impostare l'intestazione Content-Length, il browser lo farà per te.
  • richiesta Get ha content-length = 0.

Qualcosa di simile al di sotto dovrebbe funzionare per voi:

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