วิธีที่ถูกต้องในการส่งค่าหลายค่าสำหรับชื่อพารามิเตอร์เดียวกันในคำขอ GET


194

ฉันกำลังดูว่าวิธีที่ถูกต้องในการส่งผ่านค่าหลายค่าสำหรับชื่อพารามิเตอร์เดียวกันในคำขอ GET คืออะไร

ฉันเคยเห็น URL เช่นนี้:

http://server/action?id=a&id=b

และฉันเคยเห็น URL เช่นนี้:

http://server/action?id=a,b

ความเข้าใจของฉันคือการที่ถูกต้อง แต่ฉันไม่สามารถหาการอ้างอิงใด ๆ สำหรับเรื่องนี้ ฉันได้ดูข้อมูลจำเพาะของ http แต่ไม่สามารถเห็นอะไรเกี่ยวกับวิธีการที่เป็นส่วนหนึ่งของ 'แบบสอบถาม' ของ URL

ฉันไม่ต้องการคำตอบที่ระบุว่า "ไม่เป็นไร" - ถ้าฉันสร้างเว็บเซอร์ฉันต้องการรู้ว่าวิธีการใดเป็นมาตรฐานเพื่อให้ผู้ใช้เว็บเซอร์ของฉันรู้วิธีส่งพารามิเตอร์หลายตัวในชื่อเดียวกัน

ดังนั้นใครบางคนสามารถชี้ให้ฉันที่แหล่งอ้างอิงอย่างเป็นทางการเพื่อยืนยันตัวเลือกที่ถูกต้อง?

คำตอบ:


166

อันที่จริงไม่มีมาตรฐานที่กำหนดไว้ เพื่อสนับสนุนข้อมูลนั้นให้ดูที่วิกิพีเดียในบทสตริงการสืบค้น มีความคิดเห็นดังต่อไปนี้:

แม้ว่าจะไม่มีมาตรฐานที่ชัดเจน แต่เว็บเฟรมเวิร์กส่วนใหญ่จะอนุญาตให้เชื่อมโยงหลายค่ากับเขตข้อมูลเดียว [3] [4]

นอกจากนี้เมื่อคุณดูที่RFC 3986ในหัวข้อ3.4 แบบสอบถามไม่มีคำจำกัดความของพารามิเตอร์ที่มีหลายค่า

http://server/action?id=a&id=bโปรแกรมส่วนใหญ่ใช้ตัวเลือกแรกที่คุณได้แสดงให้เห็น: เพื่อสนับสนุนข้อมูลดังกล่าวให้ดูที่การเชื่อมโยง Stackoverflowและลิงค์ MSDNนี้เกี่ยวกับแอปพลิเคชัน ASP.NET ซึ่งใช้มาตรฐานเดียวกันสำหรับพารามิเตอร์ที่มีค่าหลายค่า

อย่างไรก็ตามเนื่องจากคุณกำลังพัฒนา API ฉันขอแนะนำให้คุณทำสิ่งที่ง่ายที่สุดสำหรับคุณเนื่องจากผู้เรียกใช้ API จะไม่มีปัญหาในการสร้างสตริงข้อความค้นหา


ในกรณีที่ไม่มีข้อมูลใด ๆ ในทางตรงกันข้ามฉันคิดว่าคุณพูดถูก - หาก RFC3986 ไม่ได้ระบุมาตรฐาน ขอบคุณ Eduardo
stripybadger

19
A จะแนะนำให้ใช้id=a&id=bเป็นบูลีน AND และid=a,bเป็นบูลีน OR
Alex Skrypnyk

17
FWIW PHP ไม่สนับสนุนการอ่าน args ?id=5&id=3เช่น PHP จะอ่านเพียงหนึ่งค่าสำหรับ id ที่นี่ ถ้าฉันจำได้อย่างถูกต้องมันจะต้องมีลักษณะเช่นนี้เพื่อให้ทำงานกับ PHP:?id[]=5&id[]=3
คุณลองอะไร

3
+1 สำหรับsince you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr

2
id=a,bทำให้สมมติฐานที่ว่า coma ,เป็นตัวคั่นที่ถูกต้อง ,แต่ค่าพารามิเตอร์ของคุณอาจมี จากนั้นลูกค้าจำเป็นต้องหลบหนี,ในค่าพารามิเตอร์การสืบค้น แต่คุณสามารถตัดสินใจ;ได้ดีกว่า หมายความว่าลูกค้าและเซิร์ฟเวอร์ควรใช้ตัวคั่นอย่างเป็นทางการสำหรับ API ของคุณ id=a&id=bไม่มีปัญหานี้แม้ว่าจะทำให้ URL ยาวขึ้น
Ronan Quillevere

5

ฉันขอแนะนำให้ดูว่าเบราว์เซอร์จัดการกับฟอร์มโดยค่าเริ่มต้นอย่างไร ตัวอย่างเช่นดูที่องค์ประกอบของรูปแบบ<select multiple>และวิธีการจัดการหลายค่าจากตัวอย่างนี้ที่ w3schools

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

สำหรับการใช้ PHP:

<select name="cars[]" multiple>

ตัวอย่างสดจากด้านบนที่ w3schools.com

จากข้างต้นถ้าคุณคลิก "ทะเลสาบโอเปิ้ล" และคลิกส่งมันจะสร้างผลมาจากรถยนต์ = ทะเลสาบและรถยนต์ = opel จากนั้นขึ้นอยู่กับเซิร์ฟเวอร์ส่วนท้ายรถยนต์พารามิเตอร์ควรเจอกันเป็นอาร์เรย์ที่คุณสามารถดำเนินการต่อไปได้

หวังว่านี่จะช่วยให้ทุกคนกำลังมองหาวิธีที่ 'มาตรฐาน' มากขึ้นในการจัดการปัญหานี้

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