JQuery Ajax sendet GET anstelle von POST

86

Der folgende Code löst ein GET anstelle einer POST-HTTP-Anforderung aus.

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);

Warum und wie kann ich einen POST bekommen?


Ich sehe in Google Chrome Inspect und Firefox Inspect, dass der Browser ein GET sendet. Hier ist von Chrome:

Anforderungs-URL: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Anforderungsmethode: GET-Statuscode: 200 OK


Gelöst

Die URL mit dem Namen "./api/add" sollte tatsächlich unter "./api/add/index.php" veröffentlicht werden. Es stellt sich heraus, dass der Aufruf von './api/add /index.php' oder './api/add /' mir eine POST-Anfrage gibt.

Es war nur eine falsche URL, aber aus irgendeinem Grund erhielt ich eine erfolgreiche GET-Anfrage an '.api / add /'.

Timothée HENRY
quelle
2
Warum wird es Ihrer Meinung nach eine GET-Anfrage sein?
Viktor S.
1
Haben Sie versucht, den Ajax-Aufruf auf Firefox mit geöffnetem Net Panel auf Firebug auszuführen?
Fabrizio Calderan
2
Test - Wenn Sie dies ausführen und das Netzwerkfenster überprüfen, werden Sie feststellen, dass es eine Post-Anfrage sendet
Viktor S.
1
@tucson - wie ich bereits schrieb - überprüfen Sie Ihre .htaccess-Datei. Möglicherweise wird umgeleitet, anstatt neu zu schreiben. Grundsätzlich sehe ich, dass JS in Ordnung ist (erwarte diesen Punkt in der URL './api/add', der mich verwirrt). Es sieht also eher nach einem Server-Problem aus. Und Informationen in Ihrer Frage reichen nicht aus, um konkrete Hilfe
Viktor S.
1
Fügen Sie die Lösung als Antwort bitte hinzu
Adam Lynch

Antworten:

99

Ein Problem mit MVC. Aus irgendeinem Grund funktioniert es wie erwartet, wenn ich [HttPost] entferne, obwohl ich Ajax anweise, POST zu verwenden.

  • Es stellt sich heraus, dass Sie verwenden müssen

Typ: "POST"

  • Obwohl das Beispiel auf der jQuery-Seite sagt, dass es verwendet werden soll

Methode: "POST"

Jetzt ist es POST

Aber nachdem ich die Dokumentation durchgesehen hatte, fand ich dies.

Geben Sie hier die Bildbeschreibung ein

Piotr Kula
quelle
6
Dies ist das Problem, das ich gerade hatte. wusste nicht, dass der Optionsname bei 1.9 geändert wurde. Dachte, es war immer "Methode"
Bill Garrison
1
Ich sehe kein Problem damit, beide einzubeziehen, nur um sicherzugehen. { method : "POST", type: "POST" }
Scott
Ja, Sie können alles, was Sie wollen, in den Konstruktor aufnehmen, aber beide sind aus Kompatibilitätsgründen nicht wirklich sinnvoll. Die meisten Leute werden jetzt auf jeden Fall 1.11 oder 2.1 verwenden. Dies verursacht nur ein Problem nach dem Upgrade von 1.4.3 oder 1.6.2
Piotr Kula
3
Ich habe so lange versucht, dies am Freitag zu beheben, indem ich ein altes Frontend aktualisiert habe, um eine brandneue API zu verwenden. Ich danke dir sehr!
NobleUplift
31

Ich hatte dieses Problem und laut @ FAngles Vorschlag lag es daran, dass mein .htaccess nachgestellte Schrägstriche entfernte - und ich hatte die URL auf /ajax/foo/bar/und nicht gesetzt /ajax/foo/bar. Die Umleitung ändert die Anforderung von POST zu GET. Entfernen Sie das / und Problem gelöst!

texelate
quelle
Dies löste das genaue Problem, das in der ursprünglichen Frage für mich erwähnt wurde. Ich hoste eine Laravel-App auf Wamp 3.0.6
İlter Kağan Öcal
9

Die URL wurde './api/add'tatsächlich umgeleitet './api/add/index.php'. daher dieser bizarre Nebeneffekt, den die neue Anfrage nach der Weiterleitung mit GETanstelle von gesendet hatPOST

Lösung

  • Verwenden Sie die vollständige URL './api/add/index.php'
  • oder fügen Sie einen Schrägstrich hinzu './api/add/'.
Jossef Harush
quelle
6

Ich habe dieses Verhalten auch bemerkt, als mein POST ein GET gesendet hat. Das Szenario ist ziemlich einzigartig, aber vielleicht hilft es jemandem.

Dies geschah mir auf meiner Seite zum Bearbeiten von Benutzerrollen, auf der ich Ajax (Post) als sofortige Aktion verwendete, wenn eine Rolle aktiviert oder deaktiviert wurde.

Ich hatte auch den Server so konfiguriert, dass er den Benutzer erneut authentifiziert (und umleitet), wenn sich seine Rolleninformationen ändern, damit seine Ansprüche aktualisiert werden.

Der brutale Zyklus endete als:

  1. Erstes Rollenupdate - POST - 200 Erfolg

  2. Nächstes Rollenupdate - POST - 302 gefunden -> Weiterleiten (Ich habe dies erst bemerkt, als ich Fiddler anstelle des Chrome-Netzwerkmonitors verwendet habe)

  3. Anruf von (2) umleiten (gleiche URL) - GET - 404 nicht gefunden (da ich nur Post erlaubt habe)

  4. GOTO (1)

Am Ende habe ich den Server geändert, um die erneute Authentifizierung / Aktualisierung der Ansprüche zu umgehen, als eine Ajax-Anforderung (basierend auf den Akzeptiertypen) festgestellt wurde.

Emragine
quelle
Vielen Dank!
Machineaddict
Woah! Konfrontierte etwas Ähnliches. Anscheinend erwartete es auf meiner Controller-Ebene einen Sitzungsparameter, den ich nicht in den neuen Controller-Endpunkt aufgenommen habe, und es wurde ein 302 und dann ein GET ausgeführt. Danke Kumpel.
Nimila Hiranya
4

Ich habe festgestellt, dass bei Verwendung dataType: 'jsonp'die Anfrage in eine konvertiert wird GET. Ich änderte sie dataType: 'json'sich von geändert GETzu POST.

Tonejac
quelle
Haben Sie den Grund, warum dieses Verhalten beobachtet wurde?
Saurabh Sarathe
@SaurabhSarathe - JSONP generiert Skriptelemente, die nur GET-Anforderungen generieren können.
Quentin
3

Ich hatte ein ähnliches Problem und es begann für mich zu funktionieren, sobald ich den fest codierten https://von meiner URL entfernt hatte.

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
quelle
Dies klingt eher nach einem Problem zwischen HTTP und HTTPS (dh Ihr www.someurl.com hat kein gültiges Zertifikat)
Alexis Wilke
2

Für mich sieht Ihr Code in Ordnung aus, aber wenn Sie sicher sein möchten, können Sie $ .post anstelle von $ .ajax verwenden

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

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

Mr_DeLeTeD
quelle
8
postist nur eine Kurzmethode für $ .ajax ({Typ: 'POST'})
Viktor S.
Ja, aber Ihr Code sieht gut aus. Wenn ich es
teste
1

Überprüfen Sie Ihre .htaccess-Datei oder suchen Sie nach etwas anderem, das Ihre Anfrage umleiten könnte

Viktor S.
quelle
1

Ich hatte das gleiche Problem und fand diese Frage, aber die Antworten lösten mein Problem nicht. Ich löse es schließlich, indem ich das contentTypeFeld in der Ajax-Anfrage entferne .

contentType: "application/json",
Farid Movsumov
quelle
1

Ich hatte dieses Problem und es stellte sich heraus, dass es sich um ein URL-Rewrite-Modul in IIS handelt.

Ich verwende ASP.NET MVC und WebAPI. Ich habe eine Regel erstellt, um URLs in Kleinbuchstaben zu erzwingen, damit soziale Netzwerke nicht dieselbe URL wie zwei verschiedene Seiten anzeigen.

Beispielsweise:

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

vs.

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

Dies war jedoch irgendwie mit meinen Ajax-Anfragen durcheinander. Ich habe die Regel deaktiviert und das Problem wurde behoben.

Callan
quelle
0

Ein sehr häufiger Fehler ist, dass wir den Schaltflächentyp als Senden verwenden und die Methode für das Formular nicht ändern (die standardmäßig abgerufen wird).

Stellen Sie sicher, dass Sie nicht den Schaltflächentyp "Senden" verwenden. Wenn Sie dies tun, haben Sie die Formularmethode zum Posten geändert

Junaid Masood
quelle