2012-06-08 16 views
24

Estoy tratando de enviar un objeto json utilizando el método GET. Mi código:JQuery, envíe el objeto JSON usando el método GET

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

Sin embargo, los encabezados recibidos han "Content-Length" se establece en cero, de ahí mi JSON analizador en el servidor no ha leído el contenido.

que ya han intentado fijar cabecera longitud del contenido, pero todavía viene con el servidor como cero:

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

alguna idea de cómo conseguir este trabajo? TIENE que ser solicitud GET.

+0

petición GET no han contenido ??? – Bergi

+0

La longitud del contenido es irrelevante porque no está realizando una solicitud con un cuerpo. ¿Cómo estás leyendo la solicitud? – Esailija

+3

¿Ha comprobado cómo se ve su solicitud (por ejemplo, en la pestaña Firebug - Net)? – Dusan

Respuesta

27

Las solicitudes GET (at least usually) no tienen cuerpo de mensaje. Como se menciona en the docs, jQuery anexa data de solicitudes GET a los parámetros url. Debería poder leer su parámetro sort desde allí con su aplicación de servidor.

Por cierto, ningún agente de usuario le permitirá configurar el encabezado Content-Length; lo hará (y debe hacerlo) automáticamente según los datos enviados.

4

creo que se debe utilizar para JSON.stringify parámetros GET en la URL así:

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

-1: JSON.stringify puede tener un '&' que romperá la solicitud. Además, ¿por qué contentType? – SuperSaiyan

+3

Intenté esto y usando contentType: "application/json", dataType: "json", rompe cosas cuando usas json.stringify(), las saca y boom, funciona. – ragebunny

3

Como se ha mencionado por Bergi, los datos se convierten por jQuery.ajax() para solicitar parámetros. De 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

Hay unos pocos lugares donde se han ido un poco mal.

  • No es CONTENT_LENGTH, es Content-Length.
  • No configure el encabezado Content-Length, el navegador lo hará por usted.
  • petición GET tiene un contenido de longitud = 0.

Algo así como el siguiente debería funcionar para usted:

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