ก่อนที่คุณจะอ่านคำตอบของฉันฉันอยากจะบอกว่าฉันเห็นด้วยกับ @Neil เราต้องเลือกการต่อสู้ของเรา เรามักจะต้องการทำให้ดีที่สุด แต่บางครั้งก็มีที่ว่างน้อยเกินไปสำหรับการอภิปรายและเราต้องตัดสินใจตามความต้องการของเรา
อย่างไรก็ตามในคำตอบของนีลฉันก็พลาดไปอีกอย่าง เอกสารประกอบ เพียงเพื่อให้แน่ใจว่านักพัฒนาซอฟต์แวร์ทราบว่า POST ขอ/search
ปลอดภัย
ที่กล่าวว่า
1. ให้โอกาสในการรับ
พิจารณาGET
ตัวเลือกแรก ตรวจสอบคำถามนี้ความยาวสูงสุดของ URL ประเมินว่าสตริงข้อความค้นหาที่ยาวที่สุดของคุณยาวกว่า 2000 ตัวอักษรหรือไม่ GET
ถ้ามันไม่ได้และคุณไม่ได้คาดหวังว่ามันจะไปกับ มันอาจดูน่าเกลียด แต่อย่างน้อยคุณก็สามารถบุ๊กมาร์ก URL และแน่นอนว่ามันมีข้อดีทั้งหมดที่ได้มาจากความหมายของเมธอด (idempotence, safe and caching)
1.1 ลองเข้ารหัสสตริงแบบสอบถาม
ยกตัวอย่างเช่นในฐาน 64. สนับสนุนแม้จาวาสคริปต์ฐาน 64 เข้ารหัส
นี่คือวิธีการ:
- สร้าง JSON ด้วยตัวกรองทั้งหมดและทำให้เป็นมาตรฐาน
- แยกมันเป็นสตริง
- เข้ารหัสมัน
- ส่ง JSON ที่เข้ารหัสเป็นคำขอพารามิเตอร์ (
/search?q=SGVsbG8gV29ybGQh....
)
- บนฝั่งเซิร์ฟเวอร์, ถอดรหัสพระรามQ
- ยกเลิกการทำให้เป็นสตริง JSON
ก่อนหน้านี้สร้างสตริง JSON ที่ยาวที่สุดที่เป็นไปได้เข้ารหัสและใช้ความยาว ประเมินว่าสตริงที่เข้ารหัสนั้นเหมาะสมกับ URL หรือไม่ ฉันใช้ตัวอย่างข้อมูลต่อไปนี้บนFiddle.jsเพื่อให้คุณทดสอบ (ฉันหวังว่ามันจะยังใช้งานได้) 1
การเข้ารหัส Base 64 นั้นสามารถกำหนดค่าได้และสามารถย้อนกลับได้ดังนั้นจึงไม่มีโอกาสเกิดการชน
ด้วยการสืบค้นที่เข้ารหัสเราสามารถบันทึกการค้นหาในฐานข้อมูลคั่นหน้า URL แชร์ลิงค์ ฯลฯ และแน่นอนเราไม่จำเป็นต้องหลบหนี / ยกเลิกการซ่อนสตริง
1.2 ลองใช้นามแฝง
เมื่ออ่านบล็อกนี้เกี่ยวกับวิธีออกแบบ REST APIs ฉันจำได้อีกทางเลือกหนึ่ง นามแฝงสำหรับการค้นหาที่พบบ่อย
ฉันคิดว่าสิ่งเหล่านี้น่าสนใจสำหรับเหตุผลต่อไป
ย่อความยาวสตริงข้อความค้นหาให้สั้นลง มันทำให้ API สะอาดและใช้งานง่าย
GET / tickets /? status = closed & closedAt = xxx vs
GET / tickets / เพิ่งปิด /
ใช้ร่วมกับนามแฝงอื่น ๆ หรือพารามิเตอร์คำขอมากกว่านี้
GET / tickets /? status = closed & closedAt = xxx & ภายใน = 30 นาที เทียบกับ
GET / tickets / / เพิ่งปิด / ภายใน = 30 นาที
เราสามารถรวมนามแฝงกับสตริงการสืบค้นที่เข้ารหัส
GET / tickets /? status = closed & closedAt = xxx & ภายใน = 30 นาที เทียบกับ
GET / tickets / ปิดเมื่อเร็ว ๆ นี้ /? q = SGVsbG8g ...
1: ฉันใช้ JSON แล้ว แต่เราสามารถใช้รูปแบบอื่นได้ทันทีที่เราสามารถทำการ deserialize บนฝั่งเซิร์ฟเวอร์ได้
search?q=t
,search?q=te
,search?q=test
และอื่น ๆ พิจารณา จำกัด ความถี่ในการส่งแบบสอบถามเพื่อหลีกเลี่ยงการทำร้ายเซิร์ฟเวอร์ของคุณ นอกจากนี้คุณยังสามารถส่งคืนข้อมูลจำนวนมากและในด้านลูกค้าทำการกรอง ใช้งานได้ดีหากผู้ใช้เข้าสู่หมวดหมู่ทั่วไปที่สามารถ จำกัด สิ่งต่าง ๆ ลงได้อย่างมาก