ส่ง Array ด้วย HTTP Get


99

ฉันจะส่ง Array ด้วยคำขอ HTTP Get ได้อย่างไร

ฉันใช้ไคลเอนต์ GWT เพื่อส่งคำขอ


HTML ดีกว่าในการให้แสงสว่างนี้ <input name="user[name]" /> <input name="user[email]" />ภายใน<form>คอนเทนเนอร์รู้วิธีการส่งโดยค่าเริ่มต้นในทุกเบราว์เซอร์ อินพุตจะกลายเป็นʻuser [name] = SOMETEXT & user [email] =SOME@TEXT.com --- เป็นแอปพลิเคชันโฮสต์ที่ต้องจัดการการถอดรหัสกลับเข้าอาร์เรย์
Garet Claborn

คำตอบ:


156

ขึ้นอยู่กับสิ่งที่เซิร์ฟเวอร์เป้าหมายยอมรับ ไม่มีมาตรฐานที่ชัดเจนสำหรับเรื่องนี้ ดู ao Wikipedia: สตริงการสืบค้น :

แม้ว่าจะไม่มีมาตรฐานที่ชัดเจน แต่เว็บเฟรมเวิร์กส่วนใหญ่อนุญาตให้เชื่อมโยงค่าหลายค่ากับฟิลด์เดียว (เช่นfield1=value1&field1=value2&field2=value3) [4] [5]

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

foo=value1&foo=value2&foo=value3
String[] foo = request.getParameterValues("foo"); // [value1, value2, value3]

request.getParameter("foo")ยังจะทำงานกับมัน แต่มันจะกลับเฉพาะค่าแรก

String foo = request.getParameter("foo"); // value1

และเมื่อเซิร์ฟเวอร์เป้าหมายใช้ภาษาพิมพ์ที่ไม่รัดกุมเช่น PHP หรือ RoR คุณจะต้องต่อท้ายชื่อพารามิเตอร์ด้วยวงเล็บปีกกา[]เพื่อทริกเกอร์ภาษาให้ส่งคืนอาร์เรย์ของค่าแทนค่าเดียว

foo[]=value1&foo[]=value2&foo[]=value3
$foo = $_GET["foo"]; // [value1, value2, value3]
echo is_array($foo); // true

ในกรณีที่คุณยังใช้อยู่foo=value1&foo=value2&foo=value3ระบบจะส่งคืนเฉพาะค่าแรกเท่านั้น

$foo = $_GET["foo"]; // value1
echo is_array($foo); // false

โปรดทราบว่าเมื่อคุณส่งfoo[]=value1&foo[]=value2&foo[]=value3ไปยัง Java Servlet คุณยังสามารถรับได้ แต่คุณต้องใช้ชื่อพารามิเตอร์ที่แน่นอนรวมทั้งวงเล็บปีกกา

String[] foo = request.getParameterValues("foo[]"); // [value1, value2, value3]

เมื่อเซิร์ฟเวอร์ใช้ nodeJs คุณสามารถส่งอาร์เรย์เป็น foo = [value1, value2, value3] ได้เมื่อคุณได้รับสิ่งนี้ภายในเส้นทางด่วนด้วย req.query คุณจะได้รับ {foo: '[value1, value2, value3]'} คุณต้องแยกวิเคราะห์และใช้อาร์เรย์นี้ในโค้ดของคุณ
Akshay Barpute

สิ่งที่ไร้สาระการพิมพ์ภาษาไม่เกี่ยวข้องกับมัน
omnomnom

นี่ไม่ได้ระบุไว้แน่นอน นั่นคือเหตุผลที่คำตอบระบุว่า "โดยทั่วไป" ในภาษาที่พิมพ์มากคำต่อท้ายวงเล็บ[]ในชื่อพารามิเตอร์คำขอจะไม่ได้รับการตีความเช่นเดียวกับภาษาที่พิมพ์ไม่ชัดเจน เดิมถูกนำมาใช้เป็นการแก้ปัญหาภายในสำหรับภาษาที่พิมพ์ไม่ชัดเจนเพื่อให้สามารถสร้างประเภทตัวแปรที่ต้องการได้ PHP เป็นคนแรกที่ทำเช่นนั้น
BalusC

สิ่งนี้ไม่ได้กล่าวถึง วงเล็บเป็นรูปแบบการจัดเรียง Ruby on Railsเพื่อเข้ารหัสโครงสร้างที่ซ้อนกันเป็นลำดับแบบแบน Zope (Python กรอบ) ใช้รูปแบบที่แตกต่างกันสำหรับกรณีการใช้งานเหมือนกัน โครงร่างเหล่านี้ส่วนใหญ่ถูก AJAX และ JSON ล้าสมัย ความคิดที่ว่าสิ่งนี้ควรเป็นข้อมูลทั่วไปสำหรับระบบประเภทนั้นเป็นเรื่องที่เข้าใจได้มากพูดตามตรง
Martijn Pieters

ใส่ให้แตกต่างกัน: ปัญหาคือสตริงการสืบค้นไม่มีข้อมูลประเภทไม่ใช่ว่าภาษาที่แยกวิเคราะห์สตริงข้อความค้นหานั้นพิมพ์ผิด PHP และ Ruby ไม่จำเป็นต้องใช้วงเล็บเพิ่มเติมเพื่อยอมรับหลายค่าสำหรับชื่อเดียวกัน
Martijn Pieters

187

ฉันรู้ว่าโพสต์นี้เก่ามาก แต่ฉันต้องตอบกลับเพราะแม้ว่าคำตอบของ BalusC จะถูกทำเครื่องหมายว่าถูกต้อง แต่ก็ไม่ถูกต้องทั้งหมด

คุณต้องเขียนข้อความค้นหาโดยเพิ่ม "[]" ลงใน foo ดังนี้:

foo[]=val1&foo[]=val2&foo[]=val3

5
ดีใจที่คุณตอบกลับโพสต์เก่านี้! มันช่วยได้แน่นอน
ท่าเล็ง

@BalusC ไม่ถูกต้องสิ่งนี้ใช้ได้ดีใน C / C ++ / C # (และสามารถทำงานใน java) เป็นเพียงการใช้งาน Java ของคุณซึ่งทำให้ชื่อที่เหมือนกันถูกตีความเช่นนี้ คำตอบของคุณคือการใช้การจัดรูปแบบ URI ไม่ถูกต้อง
Garet Claborn

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