แนวทางปฏิบัติที่ดีที่สุดของ REST API: อาร์กิวเมนต์ในสตริงการสืบค้นเทียบกับในเนื้อหาคำขอ


127

REST API สามารถมีอาร์กิวเมนต์ได้หลายที่:

  1. ในเนื้อความคำขอ - เป็นส่วนหนึ่งของเนื้อความ json หรือประเภท MIME อื่น ๆ
  2. ในสตริงแบบสอบถาม - เช่น/api/resource?p1=v1&p2=v2
  3. เป็นส่วนหนึ่งของเส้นทาง URL - เช่น/api/resource/v1/v2

แนวทางปฏิบัติที่ดีที่สุดและข้อควรพิจารณาในการเลือกระหว่าง 1 และ 2 ข้างต้นคืออะไร?
2 VS 3 ถูกปกคลุมที่นี่



นอกเหนือจากข้างต้นแล้วการใช้ส่วนหัวล่ะ
ตัวแปร

คำตอบ:


40

แนวทางปฏิบัติที่ดีที่สุดและข้อควรพิจารณาในการเลือกระหว่าง 1 และ 2 ข้างต้นคืออะไร?

โดยปกติเนื้อหาเนื้อหาจะใช้สำหรับข้อมูลที่จะอัปโหลด / ดาวน์โหลดไปยัง / จากเซิร์ฟเวอร์และพารามิเตอร์การสืบค้นจะใช้เพื่อระบุข้อมูลที่ต้องการ ตัวอย่างเช่นเมื่อคุณอัปโหลดไฟล์คุณระบุชื่อประเภทละครใบ้ ฯลฯ ในเนื้อหา แต่เมื่อคุณดึงรายการไฟล์คุณสามารถใช้พารามิเตอร์คิวรีเพื่อกรองรายการตามคุณสมบัติบางอย่างของไฟล์ โดยทั่วไปพารามิเตอร์แบบสอบถามเป็นคุณสมบัติของแบบสอบถามไม่ใช่ข้อมูล

แน่นอนว่านี่ไม่ใช่กฎที่เข้มงวด - คุณสามารถนำไปใช้ในลักษณะใดก็ได้ที่คุณเห็นว่าเหมาะสม / เหมาะกับคุณมากกว่า

คุณอาจต้องการตรวจสอบบทความวิกิพีเดียเกี่ยวกับสตริงข้อความค้นหาโดยเฉพาะสองย่อหน้าแรก


2
สิ่งที่สมเหตุสมผลสำหรับการวิเคราะห์ข้างต้นของคุณคือการดำเนินการที่ไม่เหมาะสมจะถูกเก็บไว้อย่างดีที่สุดในสตริงการสืบค้น url และ CRUD จะถูกเก็บไว้อย่างดีที่สุดเพื่อตอบสนองการพิมพ์อย่างเคร่งครัดซึ่งโดยพื้นฐานแล้วจะใช้ประโยชน์จาก SOP และป้องกันรูปแบบพื้นฐานของการโจมตีทางวิศวกรรมสังคม / ฟิชชิ่ง
Rice

@Rice R ใน CRUD เป็นการดำเนินการที่ไม่เหมาะสม
user398039

16

ฉันจะถือว่าคุณกำลังพูดถึงคำขอ POST / PUT โดยนัยแล้วเนื้อหาของคำขอควรมีข้อมูลที่คุณกำลังโพสต์หรือกำลังแก้ไข

สตริงการสืบค้นซึ่งเป็นส่วนหนึ่งของ URL (URI) จะมีไว้เพื่อระบุทรัพยากรที่คุณกำลังโพสต์หรือแก้ไข

คุณขอแนวทางปฏิบัติที่ดีที่สุดความหมายต่อไปนี้เป็นของฉัน แน่นอนโดยใช้กฎของหัวแม่มือของคุณควรจะทำงานพิเศษถ้ากรอบเว็บที่คุณใช้นามธรรมนี้ลงในพารามิเตอร์

คุณรู้มากที่สุด:

  • เว็บเซิร์ฟเวอร์บางแห่งมีขีดจำกัดความยาวของ URI
  • คุณสามารถส่งพารามิเตอร์ภายในเนื้อหาคำขอด้วย CURL
  • ที่ที่คุณส่งข้อมูลไม่ควรมีผลต่อการดีบัก

6

ต่อไปนี้เป็นกฎง่ายๆของฉัน ...

เมื่อใดควรใช้ร่างกาย:

  • เมื่ออาร์กิวเมนต์ไม่มีโครงสร้างคีย์แบบแบน: ค่า
  • หากค่านั้นมนุษย์ไม่สามารถอ่านได้เช่นข้อมูลไบนารีแบบอนุกรม
  • เมื่อคุณมีอาร์กิวเมนต์จำนวนมาก

เมื่อใดควรใช้สตริงการสืบค้น:

  • เมื่ออาร์กิวเมนต์อยู่ในลักษณะที่คุณต้องการเห็นในขณะที่ดีบัก
  • เมื่อคุณต้องการที่จะสามารถโทรด้วยตนเองในขณะที่พัฒนารหัสเช่นด้วย curl
  • เมื่อข้อโต้แย้งเกิดขึ้นบ่อยในบริการเว็บต่างๆ
  • เมื่อคุณส่งเนื้อหาประเภทอื่นอยู่แล้วเช่น application/octet-stream

สังเกตว่าคุณสามารถผสมและจับคู่ - ใส่สิ่งที่พบบ่อยสิ่งที่ควรแก้ไขได้ในสตริงการสืบค้นและโยนส่วนที่เหลือทั้งหมดลงใน json


34
การเลือกวิธีจัดโครงสร้าง API ของคุณตามความสะดวกในการพัฒนาไม่ใช่แนวทางปฏิบัติที่ดี
Eric Stein

1
เหมือนที่ @EricStein กล่าวว่าคุณได้ย้อนกลับไปแล้ว
DanMan

20
พวกเหตุผลที่ฉันถามคำถามคือเพื่อให้ได้คำตอบที่ถูกต้อง เอาเลยเขียนคำตอบแล้วฉันจะลบข้อบกพร่องของฉันเอง @EricStein
Jonathan

4
@Jonathan apis ที่ง่ายต่อการบริโภคผ่านมือมนุษย์มักเป็น apis ที่ดี ความรุ่งโรจน์ในการโทรหา KISS อย่างแม่นยำ
Chris Marisic

1
@AkshayHiremath เขาอ้างถึงความจริงที่ว่าคุณอาจจะส่งสิ่งอื่นในเนื้อหาเช่นถ้าคุณส่งส่วนหัว ContentType เช่น "image / jpeg" คุณจะต้องให้เนื้อหาข้อความของคุณมีข้อมูล jpeg และไม่สามารถรวมสิ่งอื่นใน มัน
Shayaan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.