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

ทำไมและฉันจะรับโพสต์ได้อย่างไร?


ฉันเห็นใน Google Chrome Inspect และ Firefox Inspect ว่าเบราว์เซอร์ส่ง GET มาจาก Chrome:

ขอ URL: http: // localhost / SAMPLE-CODES / UPDATE% 20MYSQL / api / add / Request Method: GET Status Code: 200 OK


แก้ไขแล้ว

URL ที่เรียกว่า "./api/add" คือการโพสต์ไปที่ "./api/add/index.php" ปรากฎว่าการโทร './api/add /index.php' หรือ './api/add /' ทำให้ฉันมีคำขอ POST

มันเป็นเพียง URL ที่ไม่ถูกต้อง แต่ด้วยเหตุผลบางประการฉันได้รับคำขอ GET ที่ประสบความสำเร็จเป็น ".api / add /"


2
ทำไมคุณถึงคิดว่ามันจะเป็นคำขอ GET?
Viktor S.

1
คุณเคยพยายามเรียกใช้ ajax call บน firefox โดยเปิด net panel บน firebug หรือไม่?
Fabrizio Calderan

2
ทดสอบ - หากคุณจะเรียกใช้สิ่งนี้และตรวจสอบแผงเครือข่ายคุณจะพบว่ามีการส่งคำขอโพสต์
Viktor S.

1
@tucson - ตามที่ฉันเขียนไปแล้ว - ตรวจสอบไฟล์. htaccess ของคุณ อาจทำให้เปลี่ยนเส้นทางแทนการเขียนซ้ำ โดยทั่วไปฉันเห็นว่า JS นั้นโอเค (คาดว่าจุดนั้นใน url './api/add' ซึ่งทำให้ฉันสับสน) ดังนั้นจึงดูเหมือนปัญหาเซิร์ฟเวอร์มากกว่า และข้อมูลในคำถามของคุณไม่เพียงพอที่จะให้ความช่วยเหลือที่เฉพาะเจาะจง
Viktor S.

1
โปรดเพิ่มโซลูชันเป็นคำตอบ
Adam Lynch

คำตอบ:


103

ปัญหาบางอย่างเกี่ยวกับ MVC ด้วยเหตุผลบางประการเมื่อฉันลบ [HttPost] มันก็ทำงานได้ตามที่คาดไว้แม้ว่าฉันจะบอกให้ ajax ใช้ POST ก็ตาม

  • ปรากฎว่าคุณต้องใช้

ประเภท: "POST"

  • แม้ว่าตัวอย่างในหน้า jQuery จะบอกว่าให้ใช้

วิธีการ: "POST"

ตอนนี้มันโพสต์แล้ว

แต่หลังจากขุดในเอกสารฉันพบสิ่งนี้

ใส่คำอธิบายภาพที่นี่


6
นี่คือปัญหาที่ฉันเพิ่งพบ ไม่ทราบว่าชื่อตัวเลือกมีการเปลี่ยนแปลงที่ 1.9 คิดว่ามันเป็น "วิธีการ" เสมอ
Bill Garrison

2
ฉันไม่เห็นปัญหาในการรวมทั้งสองอย่างเพื่อความแน่ใจ { method : "POST", type: "POST" }
Scott

คุณสามารถรวมสิ่งที่คุณต้องการในตัวสร้างได้ แต่การรวมทั้งสองอย่างนี้เพื่อความเข้ากันได้นั้นไม่สมเหตุสมผล คนส่วนใหญ่จะใช้ 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
İlterKağanÖcal

10

URL นี้จริงได้เปลี่ยนเส้นทางไปยัง'./api/add' './api/add/index.php'ดังนั้นจึงส่งผลกระทบด้านที่แปลกประหลาดซึ่งคำขอใหม่หลังจากการเปลี่ยนเส้นทางที่ส่งโดยใช้GETแทนPOST

วิธีการแก้

  • ใช้ URL แบบเต็ม './api/add/index.php'
  • './api/add/'หรือเพิ่มเฉือน

6

ฉันสังเกตเห็นพฤติกรรมนี้เช่นกันที่ POST ของฉันส่ง GET สถานการณ์นี้ค่อนข้างไม่เหมือนใคร แต่อาจช่วยใครบางคนได้

สิ่งนี้เกิดขึ้นกับฉันในหน้าแก้ไขบทบาทผู้ใช้ของฉันซึ่งฉันใช้ ajax (โพสต์) เป็นการดำเนินการทันทีเมื่อมีการตรวจสอบหรือไม่เลือกบทบาท

ฉันยังกำหนดค่าเซิร์ฟเวอร์ให้ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง (และเปลี่ยนเส้นทาง) เมื่อใดก็ตามที่ข้อมูลบทบาทของพวกเขาเปลี่ยนแปลงเพื่อให้การอ้างสิทธิ์ของพวกเขาถูกรีเฟรช

วงจรอันโหดร้ายจบลงด้วย:

  1. การอัปเดตบทบาทครั้งแรก - โพสต์ - 200 สำเร็จ

  2. การอัปเดตบทบาทถัดไป - POST - พบ 302 -> การเปลี่ยนเส้นทาง(ฉันไม่สังเกตเห็นสิ่งนี้จนกว่าฉันจะใช้ Fiddler แทนที่จะเป็นจอภาพเครือข่ายของ Chrome)

  3. เปลี่ยนเส้นทางการโทรจาก (2) (URL เดียวกัน) - GET - 404 Not Found (เนื่องจากฉันอนุญาตให้โพสต์เท่านั้น)

  4. โกโตะ (1)

ฉันลงเอยด้วยการเปลี่ยนเซิร์ฟเวอร์เพื่อหลีกเลี่ยงการอัปเดตการพิสูจน์ตัวตน / การอ้างสิทธิ์ซ้ำเมื่อตรวจพบคำขอ ajax (ตามประเภทการยอมรับ)


ว้าว! ต้องเผชิญกับสิ่งที่คล้ายกัน เห็นได้ชัดว่าในระดับคอนโทรลเลอร์ของฉันคาดว่าจะมีพารามิเตอร์เซสชันซึ่งฉันไม่ได้รวมไว้ในจุดสิ้นสุดของคอนโทรลเลอร์ใหม่และกำลังทำ 302 แล้วจึงรับ ขอบคุณเพื่อน
นิมิลาหิรัญญา

5

ฉันพบว่าเมื่อใช้dataType: 'jsonp'มันจะแปลงคำขอเป็นGETไฟล์. ฉันเปลี่ยนไปdataType: 'json'มันก็เปลี่ยนจากการGETPOST


คุณเป็นสาเหตุที่ทำให้เกิดพฤติกรรมนี้หรือไม่?
Saurabh Sarathe

@SaurabhSarathe - JSONP ทำงานโดยการสร้างองค์ประกอบสคริปต์ซึ่งสามารถสร้างคำขอ GET เท่านั้น
Quentin

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'})
Viktor S.

ใช่ แต่เนื่องจากรหัสของคุณดูดี เมื่อฉันทดสอบมันมีการโพสต์คำขอ
Mr_DeLeTeD


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

ข้อผิดพลาดที่พบบ่อยมากคือเราใช้ประเภทปุ่มเป็นส่งและไม่เปลี่ยนวิธีการสำหรับแบบฟอร์ม (ซึ่งจะได้รับโดยค่าเริ่มต้น)

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ประเภทปุ่มส่งและหากคุณได้เปลี่ยนวิธีการโพสต์แบบฟอร์ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.