web-dev-qa-db-fra.com

JQuery, envoyer un objet JSON à l'aide de la méthode GET

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.

29
Roman Semko

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.

32
Bergi

Il y a quelques endroits où vous vous êtes trompé.

  • Ce n'est pas CONTENT_LENGTH, son Content-Length.
  • Ne pas fixer Content-Length header, le navigateur le fera pour vous.
  • Get request has content-length = 0.

Quelque chose comme ci-dessous devrait fonctionner pour vous:

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

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",
           ...
5
bahaddin.yasar

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;
    }
3
mhu