JQuery Ajax надсилає GET замість POST


87

Наступний код запускає GET замість запиту POST HTTP.

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

Чому і як я можу отримати POST?


Я бачу в Google Chrome Inspect та Firefox Inspect, що браузер надсилає GET. Ось із Chrome:

URL-адреса запиту: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Метод запиту: GET Код стану: 200 OK


ВИРІШЕНО

URL-адреса під назвою './api/add' повинна була фактично розміщувати повідомлення на './api/add/index.php'. Виявляється, виклик './api/add /index.php' або './api/add /' дає мені запит POST.

Це була просто неправильна URL-адреса, але я чомусь отримував успішний запит GET на '.api / add /'.


2
Чому, на вашу думку, це буде запит GET?
Віктор С.

1
Ви пробували запустити виклик ajax у firefox із відкритою мережевою панеллю на firebug?
Фабріціо Кальдеран

2
Тест - якщо ви запустите це і перевірите мережеву панель, ви виявите, що вона надсилає запит на публікацію
Віктор С.

1
@tucson - як я вже писав - перевірте свій файл .htaccess. Можливо, це робить перенаправлення замість перезапису. В основному, я бачу, що JS добре (очікуйте тієї крапки в url './api/add', яка мене бентежить). Тож це більше схоже на проблему на сервері. І інформації у вашому запитанні недостатньо, щоб надати конкретну допомогу
Віктор С.

1
Додайте рішення як відповідь
Адам Лінч,

Відповіді:


101

Деякі проблеми з MVC. З якоїсь причини, коли я видаляю [HttPost], він працює належним чином, хоча я кажу ajax використовувати POST.

  • Виявляється, потрібно використовувати

тип: "POST"

  • Незважаючи на те, що приклад на сторінці jQuery говорить про використання

метод: "POST"

Тепер це POST

Але, покопавшись у документації, я знайшов це.

введіть тут опис зображення


6
це питання, яке я ПРОСТО мав. не усвідомлював, що назву опції змінили на 1.9. Думав, що це завжди "метод"
Білл Гаррісон,

2
Я не бачу проблем із включенням обох, щоб бути впевненим. { method : "POST", type: "POST" }
Скотт

Так, ви можете включити в конструктор все, що завгодно, але включати обидва для сумісності насправді не має сенсу. Більшість людей використовуватимуть 1.11 або 2.1 дотепер будь-яким способом. Це просто викликає проблему після оновлення, як з 1.4.3 або 1.6.2
Piotr Kula

3
Я так довго намагався це виправити в п’ятницю, оновлюючи старий інтерфейс, щоб використовувати абсолютно новий API. Дуже дякую!
NobleUplift

31

У мене виникла ця проблема, і згідно з пропозицією @ FAngle це було тому, що мій .htaccess видаляв кінцеві похилі риси - і я встановив URL-адресу на /ajax/foo/bar/ні /ajax/foo/bar. Перенаправлення змінює запит з POST на GET. Видаліть / і проблема вирішена!


Це вирішило точну проблему, згадану в оригінальному питанні для мене. Я розміщую додаток laravel на Wamp 3.0.6
İlter Kağan Öcal

9

URL-адреса './api/add'фактично була перенаправлена ​​на './api/add/index.php'. тому цей химерний побічний ефект, який новий запит після переадресації відправляється з використанням GETзамістьPOST

Рішення

  • використовуйте повну URL-адресу './api/add/index.php'
  • або додайте скісну риску './api/add/'.

6

Я також помітив цю поведінку, коли мій POST надсилав GET. Сценарій досить унікальний, але, можливо, він комусь допоможе.

Це траплялося зі мною на моїй сторінці редагування ролі користувача, де я використовував ajax (пост) як негайну дію, коли роль була перевірена або знята.

Мені також було налаштовано сервер для повторної автентифікації користувача (та перенаправлення їх) щоразу, коли інформація про їх роль змінювалася, щоб їх заявки були оновлені.

Жорстокий цикл закінчився як:

  1. Перше оновлення ролі - POST - 200 успіхів

  2. Наступне оновлення ролі - POST - 302 знайдено -> Переспрямування (я не помітив цього, поки не використав Fiddler, а не мережевий монітор Chrome)

  3. Переадресація дзвінка з (2) (Та сама URL-адреса) - GET - 404 не знайдено (оскільки я дозволив лише розміщувати повідомлення)

  4. ГОТО (1)

У підсумку я змінив сервер, щоб обійти повторну автентифікацію / оновлення заявок, коли він виявив запит ajax (на основі типів прийняття).


Дуже дякую!
машинний вирок

Вау! Зіткнувся з чимось подібним. Очевидно, на моєму рівні контролера він очікував параметра сеансу, який я не включив у нову кінцеву точку контролера, і він робив 302, а потім GET. Дякую, друже.
Німіла Хіранья,

5

Я виявив, що при dataType: 'jsonp'його використанні перетворює запит у файл GET. Я змінив його на dataType: 'json'змінився з GETна POST.


Чи є ви причиною того, чому спостерігалася така поведінка?
Saurabh Sarathe

@SaurabhSarathe - JSONP працює, створюючи елементи сценарію, які можуть генерувати лише запити GET.
Квентін

3

У мене була подібна проблема, і вона почала працювати для мене, як тільки я видалив жорстко закодований https://з своєї 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"
});

Це більше схоже на проблему між HTTP та HTTPS (тобто ваш www.someurl.com не має дійсного сертифіката)
Alexis Wilke

2

Для мене ваш фрагмент коду виглядає нормально, але якщо ви хочете бути впевненим, ви можете використовувати $ .post замість $ .ajax

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

jquery посилання: http://api.jquery.com/jQuery.post/


8
post- це просто скорочений метод для $ .ajax ({type: 'POST'})
Віктор С.

Так, але як ваш код виглядає добре. коли я його тестую, він робить якийсь запит на повідомлення
Mr_DeLeTeD

1

Перевірте свій файл .htaccess або знайдіть щось інше, що може перенаправити ваш запит


1

У мене була та сама проблема, і я знайшов це питання, але відповіді не вирішили мою проблему. Врешті-решт я вирішую це шляхом видалення contentTypeполя в запиті ajax.

contentType: "application/json",

1

У мене виникла ця проблема, і виявилося, що це модуль перезапису URL-адрес у IIS.

Я використовую ASP.NET MVC та WebAPI. Я створив правило, щоб примусити малі URL-адреси, щоб соціальні мережі не переглядали одну і ту ж URL-адресу як дві різні сторінки.

Наприклад:

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

проти

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

Однак це якось возилось з моїми запитами ajax. Я вимкнув правило, і проблема була вирішена.


0

дуже поширена помилка полягає в тому, що ми використовуємо тип кнопки як подати, а не змінюємо метод форми (який отримуємо за замовчуванням)

переконайтесь, що ви не використовуєте тип кнопки "Надіслати". Якщо ви використовуєте, ви змінили метод форми на публікацію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.