JQuery Ajax wysyła GET zamiast POST

87

Poniższy kod wyzwala GET zamiast żądania 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);

Dlaczego i jak mogę otrzymać POST?


Widzę w Google Chrome Inspect i Firefox Inspect, że przeglądarka wysyła GET. Oto z Chrome:

Adres URL żądania: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Metoda żądania: GET Kod stanu: 200 OK


ROZWIĄZANY

Adres URL o nazwie „./api/add” miał faktycznie wysyłać do „./api/add/index.php”. Okazuje się, że wywołanie „./api/add /index.php” lub „./api/add /” daje mi żądanie POST.

To był po prostu zły adres URL, ale z jakiegoś powodu otrzymałem udane żądanie GET do „.api / add /”.

Timothée HENRY
źródło
2
Jak myślisz, dlaczego będzie to żądanie GET?
Viktor S.,
1
Czy próbowałeś uruchomić wywołanie Ajax w przeglądarce Firefox z panelem sieciowym otwartym w programie Firebug?
Fabrizio Calderan,
2
Test - jeśli to uruchomisz i sprawdzisz panel sieciowy, okaże się, że wysyła on prośbę o wpis
Viktor S.
1
@tucson - jak już napisałem - sprawdź swój plik .htaccess. Prawdopodobnie powoduje przekierowanie zamiast przepisywania. Zasadniczo widzę, że JS jest w porządku (spodziewaj się kropki w adresie URL './api/add', która mnie dezorientuje). Więc wygląda to bardziej na problem po stronie serwera. A informacje w Twoim pytaniu nie wystarczą, aby udzielić konkretnej pomocy
Viktor S.,
1
Dodaj rozwiązanie jako odpowiedź
Adam Lynch

Odpowiedzi:

101

Jakiś problem na MVC. Z jakiegoś powodu, kiedy usuwam [HttPost], działa to zgodnie z oczekiwaniami, mimo że mówię Ajax, aby używał POST.

  • Okazuje się, że musisz użyć

typ: „POST”

  • Mimo że przykład na stronie jQuery mówi, aby użyć

metoda: „POST”

Teraz to POST

Ale po przekopaniu się w dokumentacji znalazłem to.

wprowadź opis obrazu tutaj

Piotr Kula
źródło
6
to jest problem, który właśnie miałem. nie zdawałem sobie sprawy, że nazwa opcji została zmieniona przy 1,9. Myślałem, że to zawsze „metoda”
Bill Garrison
2
Dla pewności nie widzę problemu z dołączeniem obu. { method : "POST", type: "POST" }
Scott
Tak, możesz dołączyć cokolwiek chcesz w konstruktorze, ale włączenie obu tych elementów dla kompatybilności nie ma sensu. Większość ludzi w jakikolwiek sposób będzie już używać 1.11 lub 2.1. To po prostu powoduje problem po aktualizacji jak z 1.4.3 czy 1.6.2
Piotr Kula
3
Spędziłem tak dużo czasu, próbując to naprawić w piątek, aktualizując stary interfejs, aby używał zupełnie nowego interfejsu API. Dziękuję bardzo!
NobleUplift
31

Miałem ten problem i zgodnie z sugestią @ FAngle było to spowodowane tym, że mój .htaccess usuwał końcowe ukośniki - i ustawiłem adres URL na, /ajax/foo/bar/a nie /ajax/foo/bar. Przekierowanie zmienia żądanie z POST na GET. Usuń / i problem rozwiązany!

texelate
źródło
To rozwiązało dokładnie ten problem, o którym pisałem w pierwszym pytaniu. Hostuję aplikację laravel na Wamp 3.0.6
İlter Kağan Öcal
10

Adres URL './api/add'faktycznie został przekierowany do './api/add/index.php'. dlatego ten dziwaczny efekt boczny, który nowe żądanie po przekierowaniu wysłało za pomocą GETzamiastPOST

Rozwiązanie

  • użyj pełnego adresu URL './api/add/index.php'
  • lub dodaj ukośnik './api/add/'.
Jossef Harush
źródło
6

Zauważyłem to zachowanie, gdy mój POST wysyłał GET. Scenariusz jest dość wyjątkowy, ale może komuś pomoże.

Stało się to ze mną na mojej stronie edycji roli użytkownika, gdzie używałem ajax (post) jako natychmiastowej akcji, gdy rola została zaznaczona lub odznaczona.

Skonfigurowałem również serwer, aby ponownie uwierzytelniał użytkownika (i przekierowywał go) za każdym razem, gdy zmieniły się informacje o jego roli, aby ich roszczenia zostały odświeżone.

Brutalny cykl zakończył się następująco:

  1. Pierwsza aktualizacja roli - POST - 200 sukcesów

  2. Następna aktualizacja roli - POST - Znaleziono 302 -> Przekierowanie (nie zauważyłem tego, dopóki nie użyłem programu Fiddler zamiast monitora sieci Chrome)

  3. Przekieruj połączenie z (2) (ten sam adres URL) - GET - 404 nie znaleziono (ponieważ zezwalałem tylko na wysyłanie wiadomości)

  4. GOTO (1)

Skończyło się na tym, że zmieniłem serwer, aby ominął ponowne uwierzytelnianie / aktualizację oświadczeń, gdy wykrył żądanie ajax (w oparciu o typy akceptacji).

emragins
źródło
Dziękuję Ci bardzo!
machineaddict
Woah! W obliczu czegoś podobnego. Najwyraźniej na moim poziomie kontrolera oczekiwał parametru sesji, którego nie umieściłem w nowym punkcie końcowym kontrolera, i wykonywał 302, a następnie GET. Dzięki stary.
Nimila Hiranya
5

Zauważyłem, że podczas korzystania z dataType: 'jsonp'niego konwertuje żądanie na plik GET. Zmieniłem to na dataType: 'json'zmieniło się z GETna POST.

tonejac
źródło
Czy jesteś powodem, dla którego zaobserwowano to zachowanie?
Saurabh Sarathe
@SaurabhSarathe - JSONP działa poprzez generowanie elementów skryptu, które mogą generować tylko żądania GET.
Quentin
3

Miałem podobny problem i zaczęło działać dla mnie, gdy tylko usunąłem zakodowany na stałe https://z mojego adresu 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
źródło
To brzmi bardziej jak problem między HTTP i HTTPS (tzn. Twój www.someurl.com nie ma ważnego certyfikatu)
Alexis Wilke
2

Dla mnie Twój fragment kodu wygląda dobrze, ale jeśli chcesz mieć pewność, możesz użyć $ .post zamiast $ .ajax

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

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

Mr_DeLeTeD
źródło
8
postto tylko skrótowa metoda dla $ .ajax ({type: 'POST'})
Viktor S.,
Tak, ale ponieważ twój kod wygląda dobrze. kiedy go
testuję, wysyła
1

Sprawdź swój plik .htaccess lub poszukaj czegoś, co może przekierować Twoje żądanie

Viktor S.
źródło
1

Miałem ten sam problem i znalazłem to pytanie, ale odpowiedzi nie rozwiązały mojego problemu. Ostatecznie rozwiązuję to, usuwając contentTypepole w żądaniu Ajax.

contentType: "application/json",
Farid Movsumov
źródło
1

Miałem ten problem i okazało się, że jest to moduł ponownego zapisywania adresów URL w usługach IIS.

Używam ASP.NET MVC i WebAPI. Stworzyłem regułę, która wymusza małe adresy URL, aby sieci społecznościowe nie wyświetlały tego samego adresu URL na dwóch różnych stronach.

Na przykład:

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

vs

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

To jednak w jakiś sposób zakłócało moje żądania Ajax. Wyłączyłem regułę i problem został rozwiązany.

Callan
źródło
0

bardzo częstym błędem jest to, że używamy typu przycisku jako przesyłania i nie zmieniamy metody dla formularza (która jest domyślnie pobierana)

upewnij się, że nie używasz przycisku typu wyślij, a jeśli tak, to zmieniłeś metodę formularza na post

Junaid Masood
źródło