JQuery Ajax đang gửi GET thay vì POST


87

Đoạn mã sau sẽ kích hoạt yêu cầu GET thay vì 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);

Tại sao và làm cách nào để nhận được BÀI ĐĂNG?


Tôi thấy trong Google Chrome Kiểm tra và Firefox Kiểm tra rằng trình duyệt gửi một GET. Đây là từ Chrome:

URL yêu cầu: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Request Method: NHẬN Mã trạng thái: 200 OK


GIẢI QUYẾT

URL có tên './api/add' thực sự được đăng lên './api/add/index.php'. Hóa ra việc gọi './api/add /index.php' hoặc './api/add /' mang lại cho tôi yêu cầu ĐĂNG.

Đó chỉ là một URL sai, nhưng vì lý do nào đó, tôi đã nhận được yêu cầu GET thành công tới '.api / add /'.


2
Tại sao bạn nghĩ rằng nó sẽ là một yêu cầu GET?
Viktor S.

1
Bạn đã thử chạy cuộc gọi ajax trên firefox với bảng điều khiển mạng được mở trên firebug chưa?
Fabrizio Calderan

2
Kiểm tra - nếu bạn sẽ chạy này và kiểm tra bảng điều khiển mạng, bạn sẽ thấy rằng nó sẽ gửi một yêu cầu bài
Viktor S.

1
@tucson - như tôi đã viết - hãy kiểm tra tệp .htaccess của bạn. Có thể nó làm cho chuyển hướng thay vì viết lại. Về cơ bản, tôi thấy rằng JS là Ok (mong đợi dấu chấm đó trong url './api/add' khiến tôi bối rối). Vì vậy, nó trông giống như vấn đề bên máy chủ hơn. Và thông tin trong câu hỏi của bạn không đủ để cung cấp cho sự giúp đỡ cụ thể
Viktor S.

1
Thêm giải pháp là câu trả lời xin vui lòng
Adam Lynch

Câu trả lời:


101

Một số vấn đề trên MVC. Vì một số lý do khi tôi xóa [HttPost], nó hoạt động như mong đợi, mặc dù tôi đang yêu cầu ajax sử dụng POST.

  • Hóa ra bạn cần sử dụng

gõ: "ĐĂNG"

  • Mặc dù ví dụ trên trang jQuery nói rằng sử dụng

phương thức: "ĐĂNG"

Bây giờ nó ĐĂNG của

Nhưng sau khi đào trong tài liệu tôi đã tìm thấy điều này.

nhập mô tả hình ảnh ở đây


6
đây là vấn đề tôi CHỈ gặp phải. không nhận ra rằng tên tùy chọn đã được thay đổi ở 1,9. Nghĩ rằng nó luôn luôn là "phương pháp"
Bill Garrison

2
Tôi thấy không có vấn đề gì với việc bao gồm cả hai chỉ để chắc chắn. { method : "POST", type: "POST" }
Scott

Phải, bạn có thể bao gồm bất cứ thứ gì bạn muốn trong hàm tạo, nhưng bao gồm cả hai điều này để tương thích không thực sự có ý nghĩa. Bây giờ hầu hết mọi người sẽ sử dụng 1.11 hoặc 2.1. Điều này chỉ gây ra một vấn đề sau khi nâng cấp như thế nào từ 1.4.3 hoặc 1.6.2
Piotr Kula

3
Tôi đã dành rất nhiều thời gian để cố gắng khắc phục sự cố này vào thứ Sáu, cập nhật giao diện người dùng cũ để sử dụng một API hoàn toàn mới. Cảm ơn bạn rất nhiều!
NobleUplift

31

Tôi đã gặp vấn đề này và theo đề xuất của @ FAngle thì đó là do .htaccess của tôi đang xóa các dấu gạch chéo ở cuối - và tôi đã đặt url thành /ajax/foo/bar/và không /ajax/foo/bar. Chuyển hướng thay đổi yêu cầu từ POST thành GET. Loại bỏ / và vấn đề đã được giải quyết!


Điều này đã giải quyết vấn đề chính xác được đề cập trong câu hỏi ban đầu cho tôi. Tôi đang lưu trữ một ứng dụng laravel trên Wamp 3.0.6
İlter Kağan Öcal.

9

URL './api/add'thực sự đã được chuyển hướng đến './api/add/index.php'. do đó, điều kỳ lạ này ảnh hưởng đến mặt mà yêu cầu mới sau khi chuyển hướng được gửi bằng cách sử dụng GETthay vìPOST

Giải pháp

  • sử dụng url đầy đủ './api/add/index.php'
  • hoặc thêm dấu gạch chéo './api/add/'.

6

Tôi đã nhận thấy hành vi này cũng như nơi POST của tôi đang gửi GET. Kịch bản khá độc đáo, nhưng có thể nó sẽ giúp ích cho ai đó.

Điều này đã xảy ra với tôi trên trang chỉnh sửa Vai trò Người dùng của tôi, nơi tôi đang sử dụng ajax (bài đăng) như một hành động tức thì khi một vai trò được chọn hoặc bỏ chọn.

Tôi cũng đã định cấu hình máy chủ để xác thực lại người dùng (và chuyển hướng họ) bất cứ khi nào thông tin vai trò của họ thay đổi để xác nhận quyền sở hữu của họ sẽ được làm mới.

Chu kỳ tàn bạo kết thúc là:

  1. Cập nhật vai trò đầu tiên - ĐĂNG - 200 thành công

  2. Cập nhật vai trò tiếp theo - POST - 302 Tìm thấy -> Chuyển hướng (Tôi không nhận thấy điều này cho đến khi tôi sử dụng Fiddler thay vì màn hình mạng của Chrome)

  3. Cuộc gọi chuyển hướng từ (2) (Cùng một URL) - GET - 404 Không tìm thấy (vì tôi chỉ cho phép Đăng)

  4. GOTO (1)

Tôi đã kết thúc việc thay đổi máy chủ để bỏ qua cập nhật xác thực lại / xác nhận quyền sở hữu khi nó phát hiện yêu cầu ajax (dựa trên Loại chấp nhận).


Cảm ơn rât nhiều!
machineaddict

Chà! Đối mặt với một cái gì đó tương tự. Rõ ràng, ở cấp bộ điều khiển của tôi, nó đang mong đợi một tham số phiên mà tôi chưa đưa vào điểm cuối bộ điều khiển mới và nó đang thực hiện 302 và sau đó là GET. Cảm ơn người bạn đời.
Nimila Hiranya

5

Tôi thấy rằng khi sử dụng dataType: 'jsonp'nó chuyển đổi yêu cầu thành a GET. Tôi đã thay đổi nó thành dataType: 'json'nó đã thay đổi từ GETthành POST.


Bạn có lý do tại sao hành vi này được quan sát?
Saurabh Sarathe

@SaurabhSarathe - JSONP hoạt động bằng cách tạo các phần tử script chỉ có thể tạo các yêu cầu GET.
Quentin

3

Tôi đã gặp sự cố tương tự và nó bắt đầu hoạt động với tôi ngay sau khi tôi xóa mã cứng https://khỏi url của mình.

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

Đây âm thanh giống như một vấn đề giữa HTTP và HTTPS (tức là bạn www.someurl.com không có giấy chứng nhận hợp lệ)
Alexis Wilke

2

Đối với tôi, đoạn mã của bạn trông ổn, nhưng nếu bạn muốn chắc chắn, bạn có thể sử dụng $ .post thay vì $ .ajax

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

liên kết jquery: http://api.jquery.com/jQuery.post/


8
postchỉ là một phương pháp tốc ký với $ .ajax ({type: 'POST'})
Viktor S.

Có, nhưng khi mã của bạn trông đẹp. khi tôi đang thử nghiệm nó, nó hiện một số yêu cầu bài
Mr_DeLeTeD

1

Kiểm tra tệp .htaccess của bạn hoặc tìm kiếm một số thứ khác có thể chuyển hướng yêu cầu của bạn


1

Tôi đã gặp vấn đề tương tự và tìm thấy câu hỏi này nhưng câu trả lời không giải quyết được vấn đề của tôi. Cuối cùng tôi giải quyết nó bằng cách xóa contentTypetrường trong yêu cầu ajax.

contentType: "application/json",

1

Tôi gặp sự cố này và hóa ra nó là mô-đun Viết lại URL trong IIS.

Tôi đang sử dụng ASP.NET MVC và WebAPI. Tôi đã tạo quy tắc để buộc các URL viết thường để các mạng xã hội không xem cùng một URL như hai trang khác nhau.

Ví dụ:

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

vs

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

Tuy nhiên, điều này bằng cách nào đó đã làm rối tung các yêu cầu ajax của tôi. Tôi đã vô hiệu hóa quy tắc và sự cố đã được giải quyết.


0

một sai lầm rất phổ biến là chúng tôi đang sử dụng loại nút là gửi và không thay đổi phương thức cho biểu mẫu (được lấy theo mặc định)

đảm bảo rằng bạn không sử dụng loại nút gửi và nếu bạn đã thay đổi phương pháp biểu mẫu để đăng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.