JQuery Ajax отправляет GET вместо POST


87

Следующий код запускает GET вместо 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);

Почему и как я могу получить 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
Петр Кула

3
В пятницу я так долго пытался исправить это, обновляя старый интерфейс, чтобы использовать совершенно новый API. Спасибо огромное!
NobleUplift

31

У меня была эта проблема, и по предложению @ FAngle это было потому, что мой .htaccess удалял конечные косые черты - и я установил URL-адрес, /ajax/foo/bar/а не /ajax/foo/bar. Перенаправление изменяет запрос с POST на GET. Удалите / и проблема решена!


Это решило для меня точную проблему, упомянутую в исходном вопросе. Я размещаю приложение laravel на Wamp 3.0.6
İlter Kaan Öcal

10

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 Not Found (так как я разрешил только публикацию)

  4. GOTO (1)

Я закончил тем, что сменил сервер, чтобы обойти повторную аутентификацию / обновление требований, когда он обнаружил запрос ajax (на основе типов принятия).


Большое спасибо!
machineaddict

Вау! Сталкивался с чем-то похожим. Очевидно, на уровне моего контроллера он ожидал параметр сеанса, который я не включил в новую конечную точку контроллера, и выполнял 302, а затем GET. Спасибо друг.
Нимила Хиранья

5

Я обнаружил, что при использовании dataType: 'jsonp'он преобразует запрос в файл GET. Я поменял на dataType: 'json'это поменял с GETна POST.


У вас есть причина, по которой наблюдалось такое поведение?
Саураб Сарат

@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.