อะไรคือความแตกต่างระหว่างพารามิเตอร์ URL และสตริงการค้นหา


92

ฉันไม่เห็นความแตกต่างระหว่างพารามิเตอร์และสตริงการค้นหาใน URL แล้วความแตกต่างคืออะไรและควรใช้เมื่อใด?


1
คุณมีบริบทหรือไม่เพราะเท่าที่ฉันทราบโดยทั่วไปแล้วทั้งสองจะใช้เหมือนกัน - แต่กรณีของคุณอาจมีบริบทเฉพาะ
Allan S. Hansen

ฉันไม่มีบริบทเฉพาะเป็นคำถามทั่วไป ในกรณีใดฉันควรใช้ทางเดียวแทนอีกวิธีหนึ่ง ต้องมีการใช้งานที่แตกต่างกันของทั้งสอง
Konst

โดยส่วนตัว - ฉันใช้พารามิเตอร์ word เป็นส่วนใหญ่เมื่อนำมาใช้ในบริบทการเรียกตัวแปรหรือวิธีการและสตริงการสืบค้นเมื่อพูดถึงพารามิเตอร์เหล่านี้ในบริบท URL (เช่นสตริงการสืบค้นจะแบ่งออกเป็นพารามิเตอร์สำหรับวิธีการ) แต่มันเป็นแค่ภาษาดังนั้นบริบทและสถานการณ์จึงแตกต่างกันและฉันสงสัยว่าจะมีใครตามล่าคุณเพราะใช้อย่างใดอย่างหนึ่งเมื่อคุณ "รู้สึก" ชอบ :)
Allan S. Hansen

คำตอบ:


85

ส่วนประกอบแบบสอบถามจะแสดงโดยครั้งแรก?ใน URI "สตริงการสืบค้น" อาจเป็นคำพ้องความหมาย (คำนี้ไม่ได้ใช้ในมาตรฐาน URI)

ตัวอย่างบางส่วนสำหรับ HTTP URI ที่มีคอมโพเนนต์การสืบค้น:

http://example.com/foo?bar
http://example.com/foo/foo/foo?bar/bar/bar
http://example.com/?bar
http://example.com/?@bar._=???/1:
http://example.com/?bar1=a&bar2=b

( รายการอักขระที่อนุญาตในส่วนประกอบแบบสอบถาม )

"รูปแบบ" ของส่วนประกอบแบบสอบถามขึ้นอยู่กับผู้เขียน URI แบบแผนทั่วไป ( แต่ไม่มีอะไรมากไปกว่าแบบแผนเท่าที่เกี่ยวข้องกับมาตรฐาน URI ¹) คือการใช้คอมโพเนนต์การสืบค้นสำหรับคู่คีย์ - ค่าหรือที่เรียกว่า พารามิเตอร์เช่นในตัวอย่างสุดท้ายด้านบน: bar1=a&bar2=b.

พารามิเตอร์ดังกล่าวอาจปรากฏในองค์ประกอบ URI อื่น ๆ เช่นพา ธ ²และส่วน สำหรับมาตรฐาน URI นั้นขึ้นอยู่กับคุณว่าจะใช้องค์ประกอบใดและรูปแบบใด

ตัวอย่าง URI ที่มีพารามิเตอร์ในพา ธ คิวรีและแฟรกเมนต์:

http://example.com/foo;key1=value1?key2=value2#key3=value3

¹มาตรฐาน URI กล่าวเกี่ยวกับองค์ประกอบการสืบค้น :

[…] คอมโพเนนต์การสืบค้นมักใช้เพื่อดำเนินการระบุข้อมูลในรูปแบบของคู่ "คีย์ = ค่า" […]

²มาตรฐาน URI กล่าวเกี่ยวกับองค์ประกอบเส้นทาง :

[…] อักขระที่สงวนไว้ (";") และเท่ากับ ("=") มักใช้เพื่อคั่นพารามิเตอร์และค่าพารามิเตอร์ที่เกี่ยวข้องกับเซ็กเมนต์นั้น เครื่องหมายจุลภาค (",") ที่สงวนไว้มักใช้เพื่อวัตถุประสงค์ที่คล้ายคลึงกัน


1
พารามิเตอร์และแบบสอบถามแตกต่างกัน ดูหัวข้อ 3.3 และ 3.4 ในtools.ietf.org/html/rfc2396.html
cowlinator

@cowlinator: (RFC 2396 ล้าสมัย แต่มาตรฐานปัจจุบัน RFC 3986 กล่าวว่ามีบางอย่างที่คล้ายกันเกี่ยวกับพารามิเตอร์ในองค์ประกอบเส้นทาง ) ฉันไม่ได้ระบุว่าพวกเขาเหมือนกันหรือฉัน? ผู้เขียน URI สามารถระบุพารามิเตอร์ในคอมโพเนนต์การสืบค้น (ตามที่อธิบายไว้ในคำตอบของฉัน) และพวกเขายังสามารถระบุพารามิเตอร์ในองค์ประกอบเส้นทาง (ตามที่อธิบายไว้ในข้อมูลอ้างอิงของคุณ) - ในทั้งสองกรณีเป็นเพียงแบบแผนไม่มีอะไรที่มาตรฐานกำหนด - คุณช่วยแนะนำการเปลี่ยนแปลงคำตอบของฉันได้ไหม คุณคิดว่า OP หมายถึงพารามิเตอร์ในเส้นทางหรือไม่?
ถึง

30

พารามิเตอร์คือคู่คีย์ - ค่าที่สามารถปรากฏในเส้นทาง URL และเริ่มต้นด้วยอักขระอัฒภาค ( ;)

สตริงคำค้นหาปรากฏหลังเส้นทาง (ถ้ามี) และขึ้นต้นด้วยอักขระเครื่องหมายคำถาม ( ?)

ทั้งพารามิเตอร์และสตริงการสืบค้นมีคู่คีย์ - ค่า

ในGETคำขอพารามิเตอร์จะปรากฏใน URL เอง:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

ในPOSTคำขอพารามิเตอร์สามารถปรากฏใน URL เอง แต่ยังปรากฏในสตรีมข้อมูล (หรือที่เรียกว่าเนื้อหา)

สตริงคำค้นหาเป็นส่วนหนึ่งของ URL เสมอ

สามารถฝังพารามิเตอร์ในform-datadatastream เมื่อใช้เมธอด POST ดังนั้นจึงอาจไม่ปรากฏใน URL ใช่POSTคำขอสามารถกำหนดพารามิเตอร์เป็นข้อมูลฟอร์มและใน URL ได้และไม่สอดคล้องกันเนื่องจากพารามิเตอร์สามารถมีได้หลายค่า

ฉันไม่พบคำอธิบายสำหรับพฤติกรรมนี้ ฉันเดาว่าบางครั้งอาจมีประโยชน์ในการ "ยกเลิกการซ่อน" พารามิเตอร์จากPOSTคำขอหรือแม้กระทั่งปล่อยให้โค้ดที่จัดการGETคำขอแชร์บางส่วนกับโค้ดที่จัดการ a POST. แน่นอนว่าสิ่งนี้สามารถใช้ได้กับพารามิเตอร์ที่รองรับโค้ดเซิร์ฟเวอร์ใน URL เท่านั้น

จนกว่าคุณจะได้รับข้อมูลเชิงลึกที่ดีขึ้นเราขอแนะนำให้คุณใช้พารามิเตอร์ในform-datadatastream ของPOSTคำขอเท่านั้น

แหล่งที่มา:

สิ่งที่นักพัฒนาทุกคนควรทราบเกี่ยวกับ URL

RFC 3986

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