J'essaie d'envoyer un objet json en utilisant la méthode GET. Mon code:
$.ajax({
url: "/api/endpoint",
type: "GET",
data: {"sort":"date"},
contentType: "application/json",
dataType: "json",
...
Cependant, les en-têtes reçus ont "Content-Length" mis à zéro, donc mon analyseur json sur le serveur ne lit pas le contenu.
J'ai déjà essayé de définir l'en-tête de la longueur du contenu, mais il arrive toujours au serveur comme zéro:
$.ajax({
url: "/api/endpoint",
headers: {"CONTENT_LENGTH",JSON.stringify({"sort":"date"}).length},
type: "GET",
data: {"sort":"date"},
contentType: "application/json",
dataType: "json",
...
Une idée comment faire fonctionner ça? Il DOIT être une demande GET.
Les requêtes GET ( au moins généralement ) n'ont pas de corps de message. Comme mentionné dans the docs , jQuery ajoute data
des requêtes GET aux paramètres url. Vous devriez pouvoir lire votre paramètre sort
à partir de là avec votre application serveur.
BTW, aucun agent utilisateur ne vous permettra de définir le Content-Length
header - il sera (et doit) être fait automatiquement en fonction des données envoyées.
Il y a quelques endroits où vous vous êtes trompé.
CONTENT_LENGTH
, son Content-Length
.Content-Length
header, le navigateur le fera pour vous.Quelque chose comme ci-dessous devrait fonctionner pour vous:
$.ajax({
url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
type: "GET",
...
});
Je pense que vous devriez utiliser JSON.stringify pour les paramètres GET dans l'URL comme ceci:
$.ajax({
url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
type: "GET",
contentType: "application/json",
dataType: "json",
...
Comme mentionné par Bergi, les données sont converties par jQuery.ajax()
pour demander des paramètres. Depuis 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;
}