JQuery Ajax envoie GET au lieu de POST

87

Le code suivant déclenche une requête GET au lieu d'une requête HTTP POST.

function AddToDatabase() {
  this.url = './api/add';
}

AddToDatabase.prototype.postData = function(dataToPost) {
$.ajax({
    type: "POST",
    url: this.url,
    data: dataToPost,
    context: this,
    success: this.onSuccess
  });
};


var AddToDatabase = new AddToDatabase();
data = {data: 'coucou'};
AddToDatabase.postData(data);

Pourquoi et comment puis-je obtenir un POST?


Je vois dans Google Chrome Inspect et Firefox Inspect que le navigateur envoie un GET. Voici de Chrome:

URL de la requête: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Méthode de requête: GET Code d'état: 200 OK


RÉSOLU

L'URL appelée «./api/add» devait en fait publier sur «./api/add/index.php». Il s'avère que l'appel «./api/add /index.php» ou «./api/add /» me donne une requête POST.

C'était juste une mauvaise URL, mais pour une raison quelconque, j'obtenais une requête GET réussie à '.api / add /'.

Timothée HENRY
la source
2
Pourquoi pensez-vous que ce sera une demande GET?
Viktor S.
1
Avez-vous essayé d'exécuter l'appel ajax sur Firefox avec le panneau net ouvert sur Firebug?
Fabrizio Calderan
2
Test - si vous l'exécutez et vérifiez le panneau réseau, vous constaterez qu'il envoie une demande de publication
Viktor S.
1
@tucson - comme je l'ai déjà écrit - vérifiez votre fichier .htaccess. Peut-être fait-il rediriger au lieu de réécrire. En gros, je vois que JS est OK (attendez-vous à ce point dans l'url './api/add' qui me déroute). Cela ressemble donc plus à un problème côté serveur. Et les informations contenues dans votre question ne sont pas suffisantes pour apporter une aide spécifique
Viktor S.
1
Ajoutez la solution comme réponse s'il vous plaît
Adam Lynch

Réponses:

101

Un problème sur MVC. Pour une raison quelconque, lorsque je supprime le [HttPost], cela fonctionne comme prévu, même si je dis à ajax d'utiliser POST.

  • Il s'avère que vous devez utiliser

type: "POST"

  • Même si l'exemple sur la page jQuery dit d'utiliser

méthode: "POST"

Maintenant c'est POST

Mais après avoir fouillé dans la documentation, j'ai trouvé ceci.

entrez la description de l'image ici

Piotr Kula
la source
6
c'est le problème que je viens d'avoir. Je n'ai pas réalisé que le nom de l'option avait été changé à 1.9. Je pensais que c'était toujours «méthode»
Bill Garrison
2
Je ne vois aucun problème à inclure les deux pour être sûr. { method : "POST", type: "POST" }
Scott
Oui, vous pouvez inclure ce que vous voulez dans le constructeur, mais inclure les deux pour la compatibilité n'a pas vraiment de sens. La plupart des gens utiliseront désormais 1.11 ou 2.1. Cela pose juste un problème après la mise à niveau, comme à partir de 1.4.3 ou 1.6.2
Piotr Kula
3
J'ai passé tellement de temps à essayer de résoudre ce problème vendredi en mettant à jour une ancienne interface pour utiliser une toute nouvelle API. Merci beaucoup!
NobleUplift
31

J'ai eu ce problème et selon la suggestion de @ FAngle, c'était parce que mon .htaccess supprimait les barres obliques de fin - et j'avais défini l'URL sur /ajax/foo/bar/et non /ajax/foo/bar. La redirection change la demande de POST à ​​GET. Supprimez le / et le problème est résolu!

texelate
la source
Cela a résolu le problème exact mentionné dans la question initiale pour moi. J'héberge une application laravel sur Wamp 3.0.6
İlter Kağan Öcal
10

L'URL './api/add'a été redirigée vers './api/add/index.php'. donc ce côté bizarre affecte que la nouvelle requête après la redirection envoyée en utilisant GETau lieu dePOST

Solution

  • utiliser l'url complète './api/add/index.php'
  • ou ajoutez une barre oblique './api/add/'.
Jossef Harush
la source
6

J'ai également remarqué ce comportement là où mon POST envoyait un GET. Le scénario est assez unique, mais peut-être qu'il aidera quelqu'un.

Cela m'arrivait sur ma page de modification de rôle utilisateur, où j'utilisais ajax (post) comme action immédiate lorsqu'un rôle était coché ou décoché.

J'ai également configuré le serveur pour ré-authentifier l'utilisateur (et le rediriger) chaque fois que les informations de son rôle changent afin que leurs revendications soient actualisées.

Le cycle brutal s'est terminé comme suit:

  1. Mise à jour du premier rôle - POST - 200 succès

  2. Prochaine mise à jour du rôle - POST - 302 trouvés -> Redirection (je n'ai pas remarqué cela jusqu'à ce que j'utilise Fiddler plutôt que le moniteur réseau de Chrome)

  3. Rediriger l'appel de (2) (même URL) - GET - 404 Not Found (puisque j'ai seulement autorisé la publication)

  4. GOTO (1)

J'ai fini par changer le serveur pour contourner la mise à jour de la ré-authentification / des revendications lorsqu'il a détecté une demande ajax (basée sur les types d'acceptation).

emragins
la source
Merci beaucoup!
machineaddict le
Woah! Face à quelque chose de similaire. Apparemment, dans mon niveau de contrôleur, il attendait un paramètre de session que je n'ai pas inclus dans le nouveau point de terminaison du contrôleur, et il faisait un 302 puis un GET. Merci mon pote.
Nimila Hiranya
5

J'ai constaté que lors de son utilisation, dataType: 'jsonp'il convertissait la demande en un fichier GET. Je l'ai changé en dataType: 'json'il est passé de GETà POST.

tonejac
la source
Avez-vous la raison pour laquelle ce comportement a été observé?
Saurabh Sarathe
@SaurabhSarathe - JSONP fonctionne en générant des éléments de script qui ne peuvent générer que des requêtes GET.
Quentin
3

J'ai eu un problème similaire et cela a commencé à fonctionner pour moi dès que j'ai supprimé le code en dur https://de mon URL.

jQuery.ajax({
 type: "POST",
 url: "www.someurl.com",//instead of "https://www.someurl.com"
 data: { foo:"bar"},
 success: function(d){ console.log(d); },
 dataType: "JSONP"
});
Parham
la source
Cela ressemble plus à un problème entre HTTP et HTTPS (c'est-à-dire que votre www.someurl.com n'a pas de certificat valide)
Alexis Wilke
2

Pour moi, votre morceau de code semble correct, mais si vous voulez être sûr, vous pouvez utiliser $ .post au lieu de $ .ajax

$.post('ajax/test.html', function(data) {
 $('.result').html(data);
});

lien jquery: http://api.jquery.com/jQuery.post/

Mr_DeLeTeD
la source
8
postest juste une méthode abrégée pour $ .ajax ({type: 'POST'})
Viktor S.
Oui, mais comme votre code semble bon. quand je le teste, il fait une demande de publication
Mr_DeLeTeD
1

Consultez votre fichier .htaccess ou recherchez un autre élément susceptible de rediriger votre demande

Viktor S.
la source
1

J'ai eu le même problème et j'ai trouvé cette question mais les réponses n'ont pas résolu mon problème. Je finis par le résoudre en supprimant le contentTypechamp dans la requête ajax.

contentType: "application/json",
Farid Movsumov
la source
1

J'ai eu ce problème, et il s'est avéré qu'il s'agissait d'un module de réécriture d'URL dans IIS.

J'utilise ASP.NET MVC et WebAPI. J'ai créé une règle pour forcer les URL minuscules afin que les réseaux sociaux ne voient pas la même URL que deux pages différentes.

Par exemple:

" http://url.com/View/Something/123GuidIdSomething "

contre

" http://url.com/view/something/123guididsomething "

Cependant, cela dérangeait en quelque sorte mes requêtes ajax. J'ai désactivé la règle et le problème a été résolu.

Callan
la source
0

une erreur très courante est que nous utilisons le type de bouton comme soumettre et que nous ne changeons pas la méthode du formulaire (qui est obtenue par défaut)

assurez-vous de ne pas utiliser le type de bouton Soumettre et si vous avez changé la méthode du formulaire pour publier

Junaid Masood
la source