ความเป็นมา (คำถามต่อไป)
ฉันได้รับ Googling นี้ไปมาเพื่ออ่านคำถาม RFCs และ SO ที่พยายามจะถอดรหัสสิ่งนี้ แต่ฉันก็ยังไม่มีแจ็ค
ดังนั้นฉันเดาว่าเราแค่โหวตให้คำตอบที่ "ดีที่สุด" เท่านั้นหรือ?
โดยทั่วไปแล้วมันจะเดือดลงถึงสิ่งนี้
3.4. คอมโพเนนต์การสืบค้น
คอมโพเนนต์แบบสอบถามคือสตริงของข้อมูลที่ทรัพยากรจะตีความ
query = *uric
ภายในคอมโพเนนต์การค้นหาอักขระ ";", "/", "?", ":", "@", "&", "=", "+", "," และ "$" จะถูกสงวนไว้
สิ่งแรกที่ทำให้ฉันประหลาดใจคือ * uric ถูกกำหนดไว้เช่นนี้
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
อย่างไรก็ตามสิ่งนี้ค่อนข้างชัดเจนโดยย่อหน้าเช่น
คลาสไวยากรณ์ "สงวนไว้" ด้านบนหมายถึงอักขระที่ได้รับอนุญาตภายใน URI แต่อาจไม่ได้รับอนุญาตภายในองค์ประกอบเฉพาะของไวยากรณ์ URI ทั่วไป ใช้เป็นตัวคั่นของส่วนประกอบที่อธิบายไว้ในส่วนที่ 3
อักขระในชุด "สงวน" ไม่ได้สงวนไว้ในทุกบริบท ชุดของอักขระที่สงวนไว้ภายในคอมโพเนนต์ URI ที่กำหนดถูกกำหนดโดยคอมโพเนนต์นั้น โดยทั่วไปอักขระจะถูกสงวนไว้หากความหมายของ URI เปลี่ยนไปหากอักขระถูกแทนที่ด้วยการเข้ารหัส US-ASCII ที่หลีกเลี่ยง
ข้อความที่ตัดตอนมาล่าสุดนี้ให้ความรู้สึกค่อนข้างย้อนกลับ แต่ระบุชัดเจนว่าชุดอักขระที่สงวนไว้ขึ้นอยู่กับบริบท แต่ 3.4 ระบุว่าอักขระที่สงวนไว้ทั้งหมดจะถูกสงวนไว้ในองค์ประกอบของแบบสอบถามอย่างไรก็ตามสิ่งเดียวที่จะเปลี่ยนความหมายในที่นี้คือการหลีกเลี่ยงเครื่องหมายคำถาม (?) เนื่องจาก URI ไม่ได้กำหนดแนวคิดของสตริงการสืบค้น
ณ จุดนี้ฉันยอมแพ้ RFC ทั้งหมด แต่พบว่า RFC 1738 น่าสนใจเป็นพิเศษ
HTTP URL อยู่ในรูปแบบ:
http://<host>:<port>/<path>?<searchpart>
ภายในคอมโพเนนต์ <path> และ <searchpart> "/", ";", "?" สงวนไว้ อาจใช้อักขระ "/" ภายใน HTTP เพื่อกำหนดโครงสร้างแบบลำดับชั้น
ฉันตีความสิ่งนี้อย่างน้อยเกี่ยวกับ HTTP URL ที่ RFC 1738 แทนที่ RFC 2396 เนื่องจากแบบสอบถาม URI ไม่มีความคิดเกี่ยวกับสตริงการสืบค้นและการตีความที่สงวนไว้ไม่อนุญาตให้ฉันกำหนดสตริงการสืบค้นตามที่ฉันคุ้นเคย กำลังทำอยู่ตอนนี้
คำถาม
ทั้งหมดนี้เริ่มต้นเมื่อฉันต้องการส่งรายการตัวเลขพร้อมกับคำขอของทรัพยากรอื่น ฉันไม่ได้คิดอะไรมากและแค่ส่งผ่านเป็นค่าที่คั่นด้วยลูกน้ำ ทำให้ฉันประหลาดใจแม้ว่าจุลภาคจะถูกหลบหนี ข้อความค้นหาที่page.html?q=1,2,3
เข้ารหัสกลายเป็นpage.html?q=1%2C2%2C3
ใช้งานได้ แต่น่าเกลียดและไม่คาดคิด นั่นคือตอนที่ฉันเริ่มเรียนรู้ RFCs
คำถามแรกของฉันคือการเข้ารหัสลูกน้ำจำเป็นจริงหรือ?
คำตอบของฉันตาม RFC 2396: ใช่ตาม RFC 1738: ไม่ใช่
ต่อมาฉันพบโพสต์ที่เกี่ยวข้องเกี่ยวกับการส่งรายการระหว่างคำขอ ในกรณีที่แนวทาง csv ทรงตัวไม่ดี สิ่งนี้ปรากฏขึ้นแทน (ไม่เคยเห็นมาก่อน)
page.html?q=1;q=2;q=3
คำถามที่สองของฉันนี่คือ URL ที่ถูกต้องหรือไม่
คำตอบของฉันตาม RFC 2396: ไม่ตาม RFC 1738: ไม่ (สงวนไว้)
ฉันไม่มีปัญหาใด ๆ กับการส่ง csv ตราบเท่าที่เป็นตัวเลข แต่ใช่คุณจะเสี่ยงต่อการต้องเข้ารหัสและถอดรหัสค่ากลับไปกลับมาหากจำเป็นต้องใช้เครื่องหมายจุลภาคกะทันหันสำหรับอย่างอื่น อย่างไรก็ตามฉันลองใช้สตริงแบบสอบถามกึ่งโคลอนด้วย ASP.NET และผลลัพธ์ก็ไม่ใช่สิ่งที่ฉันคาดหวัง
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
ฉันไม่เห็นว่าสิ่งนี้แตกต่างจากแนวทาง csv อย่างไรเมื่อฉันขอ "a" ฉันได้รับสตริงที่มีเครื่องหมายจุลภาค ASP.NET ไม่ใช่การใช้งานอ้างอิงอย่างแน่นอน แต่ก็ยังไม่ทำให้ฉันผิดหวัง
แต่ที่สำคัญที่สุด - คำถามที่สามของฉัน - ข้อกำหนดสำหรับสิ่งนี้อยู่ที่ไหน? และคุณจะทำอะไรหรือไม่ทำเพื่อเรื่องนั้น?