การออกแบบ URL สงบสำหรับการค้นหา


427

ฉันกำลังมองหาวิธีที่สมเหตุสมผลในการแสดงการค้นหาว่าเป็น URL ที่สงบเงียบ

การตั้งค่า: ฉันมีสองรุ่นคือรถยนต์และโรงรถซึ่งรถยนต์สามารถอยู่ในโรงรถได้ ดังนั้น URL ของฉันดูเหมือน:

/car/xxxx
  xxx == car id
  returns car with given id

/garage/yyy
  yyy = garage id
  returns garage with given id

รถยนต์สามารถมีอยู่ได้ด้วยตัวเอง (ดังนั้น / รถยนต์) หรือสามารถอยู่ในโรงรถได้ เป็นวิธีที่ถูกต้องในการเป็นตัวแทนพูดรถยนต์ทุกคันในโรงรถที่ให้ไว้คืออะไร? สิ่งที่ต้องการ:

/garage/yyy/cars     ?

วิธีการเกี่ยวกับการรวมกันของรถยนต์ในโรงรถ yyy และ zzz?

วิธีที่ถูกต้องในการแสดงการค้นหารถยนต์ที่มีคุณลักษณะบางอย่างคืออะไร พูดว่า: ให้ฉันดูซีดานสีน้ำเงินทั้งหมดด้วย 4 ประตู:

/car/search?color=blue&type=sedan&doors=4

หรือว่าควรจะเป็น / รถยนต์แทน

ดูเหมือนว่าการใช้ "การค้นหา" ไม่เหมาะสม - เป็นวิธี / คำที่ดีกว่าอะไร ควรเป็น:

/cars/?color=blue&type=sedan&doors=4

พารามิเตอร์การค้นหาควรเป็นส่วนหนึ่งของ PATHINFO หรือ QUERYSTRING หรือไม่

ในระยะสั้นฉันกำลังมองหาคำแนะนำสำหรับการออกแบบ url ข้ามรุ่นและสำหรับการค้นหา

[อัพเดต] ฉันชอบคำตอบของจัสติน แต่เขาไม่ครอบคลุมกรณีการค้นหาหลายช่อง:

/cars/color:blue/type:sedan/doors:4

หรืออะไรทำนองนั้น เราไปจากอย่างไร

/cars/color/blue

กรณีหลายฟิลด์?


16
แม้ว่ามันจะดูดีขึ้นในภาษาอังกฤษการผสม/carsและ/carไม่ใช่ความหมายดังนั้นจึงเป็นความคิดที่ไม่ดี ใช้พหูพจน์เสมอเมื่อมีมากกว่าหนึ่งรายการภายใต้หมวดหมู่นั้น
Zaz

4
นี่เป็นคำตอบที่ไม่ดี การค้นหาควรใช้สตริงการสืบค้น สตริงการสืบค้น 100% สงบเมื่อใช้อย่างถูกต้อง (เช่นสำหรับการค้นหา)
pbreitenbach

คำตอบ:


435

สำหรับการค้นหาให้ใช้ querystrings นี่คือการพักผ่อนที่สมบูรณ์แบบ:

/cars?color=blue&type=sedan&doors=4

ข้อได้เปรียบสำหรับการสอบถามปกติคือพวกเขาเป็นมาตรฐานและเข้าใจอย่างกว้างขวางและสามารถสร้างขึ้นได้จากฟอร์มรับ


42
สิ่งนี้ถูกต้อง จุดสตริงการสืบค้นทั้งหมดมีไว้สำหรับทำสิ่งต่าง ๆ เช่นการค้นหา
aehlke

22
อันที่จริงสิ่งนี้ถูกต้องตามRFC3986ต่อเส้นทางและการสืบค้นระบุทรัพยากร /cars?color=whateverมีอะไรมากกว่าการตั้งชื่อที่เหมาะสมก็จะ
Lloeki

35
สิ่งที่เกี่ยวกับกรณีที่คุณต้องการเปรียบเทียบ (>, <, <=,> =)? / รถยนต์? คะแนน <= 3?
เจสซี

3
ถ้าคุณต้องการเข้าถึงทรัพยากรที่ซ้อนอยู่ใต้สตริงแบบสอบถาม เช่น/cars?color=blue&type=sedan&doors=4/enginesจะไม่ทำงาน
Abe Voelker

9
@mjs /cars?param=valueสำหรับง่ายกรองบนรถรายการและ/cars/search?param=valueเป็นสำหรับการสร้างการค้นหา (กับอูโดยไม่ต้องติดตา) ซึ่งผลที่ตามมาอาจจะมีเกณฑ์การให้คะแนนการค้นหาหมวดหมู่และอื่น ๆ นอกจากนี้คุณยังสามารถสร้าง / /cars/search/mysearchลบการค้นหาชื่อเหมือน ดูที่: stackoverflow.com/a/18933902/1480391
Yves M.

121

การออกแบบ URL ที่น่ารักสงบกำลังเกี่ยวกับการแสดงทรัพยากรตามโครงสร้าง (โครงสร้างไดเรกทอรีเหมือนวันที่: บทความ / 2005/5/13, วัตถุและคุณลักษณะของมัน .. ), เครื่องหมายทับ/บ่งบอกถึงโครงสร้างลำดับชั้นใช้-idแทน

โครงสร้างลำดับชั้น

ฉันจะเป็นคนชอบ:

/garage-id/cars/car-id
/cars/car-id   #for cars not in garages

หากผู้ใช้ลบชิ้น/car-idส่วนมันจะนำcarsตัวอย่าง - ใช้งานง่าย ผู้ใช้รู้ว่าเขาอยู่ที่ไหนในต้นไม้เขามองอะไรอยู่ เขารู้ตั้งแต่แรกว่าโรงรถและรถยนต์มีความสัมพันธ์กัน นอกจากนี้ยังหมายถึงว่ามันเป็นของไม่เหมือนกัน/car-id/car/id

ค้นหา

คำค้นหานั้นตกลงเพราะมีเพียงความชอบของคุณเท่านั้นสิ่งที่ควรนำมาพิจารณา ส่วนที่ตลกมาเมื่อเข้าร่วมการค้นหา (ดูด้านล่าง)

/cars?color=blue;type=sedan   #most prefered by me
/cars;color-blue+doors-4+type-sedan   #looks good when using car-id
/cars?color=blue&doors=4&type=sedan   #I don't recommend using &*

หรืออะไรก็ตามที่ไม่ใช่สแลชตามที่อธิบายไว้ข้างต้น
สูตร: /cars[?;]color[=-:]blue[,;+&], * ถึงแม้ว่าฉันจะไม่ใช้&เครื่องหมายเพราะมันเป็นสิ่งที่ไม่สามารถจดจำได้จากข้อความเมื่อแรกเห็น

** คุณรู้หรือไม่ว่าการผ่านวัตถุ JSON ใน URI นั้นสงบแล้ว **

รายการตัวเลือก

/cars?color=black,blue,red;doors=3,5;type=sedan   #most prefered by me
/cars?color:black:blue:red;doors:3:5;type:sedan
/cars?color(black,blue,red);doors(3,5);type(sedan)   #does not look bad at all
/cars?color:(black,blue,red);doors:(3,5);type:sedan   #little difference

คุณสมบัติที่เป็นไปได้?

ปฏิเสธสตริงการค้นหา (!)
ในการค้นหารถยนต์ใด ๆ แต่ไม่ใช่ ดำและแดง :
?color=!black,!red
color:(!black,!red)

เข้าร่วมค้นหาการ
ค้นหารถยนต์สีแดงหรือสีน้ำเงินหรือสีดำที่มี3ประตูในโรงรถ id 1..20หรือ101..103หรือ999แต่ไม่ใช่ 5 /garage[id=1-20,101-103,999,!5]/cars[color=red,blue,black;doors=3]
จากนั้นคุณสามารถสร้างคำค้นหาที่ซับซ้อนมากขึ้น (ดูที่การจับคู่แอตทริบิวต์ CSS3สำหรับแนวคิดของการจับคู่สตริงย่อยเช่นการค้นหาผู้ใช้ที่มี "bar" user*=bar)

ข้อสรุป

อย่างไรก็ตามนี้อาจจะมีส่วนที่สำคัญที่สุดสำหรับคุณเพราะคุณสามารถทำมัน แต่คุณชอบหลังจากทั้งหมดเพียงแค่เก็บไว้ในใจที่สงบ URI แสดงให้เห็นถึงโครงสร้างซึ่งเป็นที่เข้าใจได้อย่างง่ายดายเช่นไดเรกทอรีเหมือน/directory/file, /collection/node/itemวัน/articles/{year}/{month}/{day}.. และเมื่อคุณไม่ใช้ กลุ่มสุดท้ายใด ๆ คุณจะรู้ทันทีว่าคุณได้อะไร

ดังนั้น .. , อักขระเหล่านี้ทั้งหมดไม่ได้รับอนุญาต :

  • ไม่ได้จอง: a-zA-Z0-9_.-~
    โดยทั่วไปแล้วอนุญาตให้เข้ารหัสทั้งสองแบบและไม่ใช่ทั้งสองวิธีนั้นจะเทียบเท่ากัน
  • ตัวอักษรพิเศษ: $-_.+!*'(),
  • สงวนไว้: ;/?:@=&
    อาจไม่ได้รับการเข้ารหัสเพื่อจุดประสงค์ในการเป็นตัวแทนมิฉะนั้นจะต้องมีการเข้ารหัส
  • ไม่ปลอดภัย: <>"#%{}|\^~[]`
    ทำไมไม่ปลอดภัยและทำไมจึงควรเข้ารหัส: RFC 1738 ดูที่ 2.2

    ดูที่RFC 1738 # page-20เพื่อดูคลาสอักขระเพิ่มเติม

RFC 3986 ดู 2.2
แม้จะมีสิ่งที่ฉันพูดก่อนหน้านี้นี่คือความแตกต่างทั่วไปของ delopes ซึ่งหมายความว่าบาง"มี"สำคัญกว่าคนอื่น ๆ

  • delimeters ทั่วไป: :/?#[]@
  • ย่อย delimeters: !$&'()*+,;=

การอ่านเพิ่มเติม:
ลำดับชั้น: ดู 2.3 , ดูที่ 1.2.3
url path พารามิเตอร์ syntax
CSS3 attribute ที่ตรงกับ
IBM: RESTful Web services - ข้อมูลพื้นฐาน
หมายเหตุ: RFC 1738 ได้รับการอัพเดตโดย RFC 3986


3
ฉันไม่เชื่อว่าฉันไม่ได้คิดที่จะใช้ JSON ในสตริงข้อความค้นหา มันเป็นคำตอบให้กับปัญหาผมกำลังเผชิญ - POSTโครงสร้างการค้นหาที่ซับซ้อนโดยไม่ต้องใช้ นอกจากนี้ความคิดอื่น ๆ ที่คุณให้ไว้ในคำตอบของคุณก็เห็นคุณค่าเช่นกัน ขอบคุณมาก ๆ!
gustavohenke

4
@Qwerty: โพสต์ที่ยอดเยี่ยม! ฉันสงสัยว่า: เหตุผลเดียวที่ใช้;เมื่อเทียบกับการ&อ่านคืออะไร? เพราะถ้าเป็นเช่นนั้นฉันคิดว่าฉันชอบที่จริง&เพราะมันเป็นตัวคั่นที่ธรรมดากว่า ... :) ขอบคุณ!
Flo

3
@Flo ใช่แน่นอน :) แต่โปรดจำไว้ว่า&ในฐานะที่เป็นตัวคั่นที่นักพัฒนาเท่านั้นที่รู้จัก ผู้ปกครองปู่ย่าตายายและประชากรที่ไม่มีการศึกษานั้นยอมรับตัวคั่นที่ใช้ในข้อความที่เป็นลายลักษณ์อักษรทั่วไป
Qwerty

17
ทำไมต้องสร้างรูปแบบที่ไม่เป็นมาตรฐานเมื่อสตริงการสืบค้นนั้นเป็นที่เข้าใจกันและเป็นมาตรฐาน?
pbreitenbach

1
@Qwerty ไม่มีอะไรหยุดคุณจาก / search? cars = แดง, น้ำเงิน, เขียว & garages = 1,2,3 หรือถ้าคุณใช้รูปแบบ <multiselect>: / search? cars = red & cars = blue & garages = 1 & garages = 2
pbreitenbach

36

แม้ว่าการมีพารามิเตอร์ในเส้นทางจะมีข้อดีบางประการ แต่ก็มี IMO ปัจจัยบางอย่างที่มีน้ำหนักเกิน

  • ไม่อนุญาตให้ใช้อักขระทั้งหมดที่จำเป็นสำหรับการค้นหาใน URL เครื่องหมายวรรคตอนและอักขระ Unicode ส่วนใหญ่จะต้องเข้ารหัส URL เป็นพารามิเตอร์สตริงแบบสอบถาม ฉันกำลังต่อสู้กับปัญหาเดียวกัน ฉันต้องการใช้ XPath ใน URL แต่ไม่รองรับไวยากรณ์ XPath ทั้งหมดที่เข้ากันได้กับพา ธ URI ดังนั้นสำหรับเส้นทางแบบง่าย ๆ/cars/doors/driver/lock/combinationจะเหมาะสมที่จะค้นหาcombinationองค์ประกอบ '' ในเอกสาร XML ประตูคนขับ แต่/car/doors[id='driver' and lock/combination='1234']ไม่เป็นมิตร

  • มีความแตกต่างระหว่างการกรองทรัพยากรตามหนึ่งในคุณลักษณะและระบุทรัพยากร

    ตัวอย่างเช่นตั้งแต่

    /cars/colors ส่งคืนรายการสีทั้งหมดสำหรับรถยนต์ทุกคัน (ทรัพยากรที่ส่งคืนคือชุดของวัตถุสี)

    /cars/colors/red,blue,green จะส่งคืนรายการวัตถุสีที่เป็นสีแดงสีน้ำเงินหรือสีเขียวไม่ใช่ชุดสะสมของรถยนต์

    ในการส่งคืนรถยนต์เส้นทางจะเป็น

    /cars?color=red,blue,green หรือ /cars/search?color=red,blue,green

  • พารามิเตอร์ในเส้นทางนั้นอ่านยากกว่าเนื่องจากคู่ชื่อ / ค่าไม่แยกออกจากส่วนที่เหลือของเส้นทางซึ่งไม่ใช่คู่ชื่อ / ค่า

หนึ่งความคิดเห็นล่าสุด ฉันชอบ/garages/yyy/cars(พหูพจน์เสมอ) ถึง/garage/yyy/cars(อาจเป็นคำผิดในคำตอบเดิม) เพราะมันหลีกเลี่ยงการเปลี่ยนเส้นทางระหว่างเอกพจน์และพหูพจน์ สำหรับคำที่มีส่วนเสริมการเปลี่ยนแปลงนั้นไม่ได้เลวร้ายนัก แต่การเปลี่ยน/person/yyy/friendsไปเป็น/people/yyyเรื่องที่ยุ่งยาก


2
ใช่ฉันเห็นด้วย ... นอกจากสิ่งที่ฉัน urls โครงสร้างเส้นทางควรสะท้อนถึงความสัมพันธ์ตามธรรมชาติระหว่างเอนทิตีแผนที่ของทรัพยากรบางอย่างเช่นโรงรถมีรถยนต์หลายคันรถเป็นของโรงรถและอื่น ๆ ... และให้ พารามิเตอร์ตัวกรองเป็นสาเหตุที่เรากำลังพูดถึงเพื่อสอบถามตัวเอง ... คุณคิดอย่างไร
opensas

31

หากต้องการขยายคำตอบของปีเตอร์ - คุณสามารถค้นหาทรัพยากรชั้นหนึ่ง:

POST    /searches          # create a new search
GET     /searches          # list all searches (admin)
GET     /searches/{id}     # show the results of a previously-run search
DELETE  /searches/{id}     # delete a search (admin)

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

มีความเป็นไปได้มากมายสำหรับการใช้การค้นหาเมื่อคุณคิดว่ามันเป็นทรัพยากร

แนวคิดนี้อธิบายรายละเอียดเพิ่มเติมในRailscastนี้


6
วิธีนี้ไม่ขัดกับแนวคิดของการทำงานกับโปรโตคอลที่ไม่อยู่กับที่หรือไม่ ฉันหมายความว่าการค้นหาฐานข้อมูลอย่างต่อเนื่องเป็นการเรียงลำดับของการเชื่อมต่อที่มีสภาวะ ...
opensas

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

2
ข้างต้นกำหนดอนุสัญญา URI อย่างไร?
Apodaca Rich

3
REST ไม่มีส่วนเกี่ยวข้องกับการทำ URIs ที่สวยงามหรือการทำรัง URI เป็นต้นหากคุณกำหนด URIs เป็นส่วนหนึ่งของ API ของคุณไม่ใช่ REST
aehlke

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

12

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

/search/{searchQuery}

หรือ

/search/{savedSearchName}

11
ไม่ มันไม่มีเหตุผลที่จะมีการกระทำเป็นทรัพยากร
thecoshman

3
@thecoshman ตามที่ระบุไว้ในความคิดเห็นด้านบนการค้นหายังเป็นคำนาม
andho

6

ฉันใช้สองวิธีเพื่อทำการค้นหา

1) กรณีที่ง่ายที่สุดในการค้นหาองค์ประกอบที่เกี่ยวข้องและสำหรับการนำทาง

    /cars?q.garage.id.eq=1

ซึ่งหมายความว่าเคียวรีรถยนต์ที่มีรหัสโรงรถเท่ากับ 1

นอกจากนี้ยังเป็นไปได้ที่จะสร้างการค้นหาที่ซับซ้อนมากขึ้น:

    /cars?q.garage.street.eq=FirstStreet&q.color.ne=red&offset=300&max=100

รถยนต์ในโรงรถทั้งหมดใน FirstStreet ที่ไม่ใช่สีแดง (หน้า 3, 100 องค์ประกอบต่อหน้า)

2) ข้อความค้นหาที่ซับซ้อนถือเป็นทรัพยากรปกติที่สร้างขึ้นและสามารถกู้คืนได้

    POST /searches  => Create
    GET  /searches/1  => Recover search
    GET  /searches/1?offset=300&max=100  => pagination in search

POST เนื้อหาสำหรับการสร้างการค้นหามีดังนี้:

    {  
       "$class":"test.Car",
       "$q":{
          "$eq" : { "color" : "red" },
          "garage" : {
             "$ne" : { "street" : "FirstStreet" }
          }
       }
    }

มันขึ้นอยู่กับ Grails (เกณฑ์ DSL): http://grails.org/doc/2.4.3/ref/Domain%20Classes/createCriteria.html


5

นี่ไม่ใช่ REST คุณไม่สามารถกำหนด URIs สำหรับทรัพยากรภายใน API ของคุณ การนำทางทรัพยากรจะต้องเป็นแบบไฮเปอร์เท็กซ์ ไม่เป็นไรถ้าคุณต้องการ URIs ที่น่ารักและการมีเพศสัมพันธ์จำนวนมาก แต่อย่าเรียกว่า REST เพราะละเมิดข้อ จำกัด ของสถาปัตยกรรม RESTful โดยตรง

ดูบทความนี้โดยนักประดิษฐ์ของ REST


28
คุณถูกต้องว่าไม่ใช่ REST เป็นการออกแบบ URL สำหรับระบบ RESTful อย่างไรก็ตามคุณไม่ถูกต้องที่บอกว่ามันละเมิดสถาปัตยกรรม RESTful ข้อ จำกัด ของไฮเปอร์เท็กซ์ของ REST นั้นเป็นแบบมุมฉากถึงการออกแบบ URL ที่ดีสำหรับระบบ RESTful ฉันจำได้ว่ามีการพูดคุยกับ Roy T. Fielding ในรายการ REST เมื่อหลายปีก่อนที่ฉันเข้าร่วมในที่ซึ่งเขากล่าวอย่างชัดเจน กล่าวอีกวิธีหนึ่งที่เป็นไปได้ที่จะมีการออกแบบไฮเปอร์เท็กซ์และ URL การออกแบบ URL สำหรับระบบ RESTful นั้นเหมือนกับการเยื้องในการเขียนโปรแกรม ไม่จำเป็น แต่เป็นความคิดที่ดีมาก (ไม่สนใจ Python และอื่น ๆ )
MikeSchinkel

2
ฉันขอโทษคุณถูกต้อง ฉันเพิ่งได้รับความประทับใจจาก OP ว่าเขาจะทำให้ลูกค้าตระหนักถึงวิธีการสร้าง URL - เขาจะสร้าง URL "เลย์เอาต์" เป็นส่วนหนึ่งของ API ของเขา นั่นจะเป็นการละเมิด REST
aehlke

@aehlke คุณควรอัปเดตคำตอบเพื่อให้ตรงกับความคิดเห็นของคุณ
James McMahon

1
มันเป็นไปตามรูปแบบครบกําหนดระดับ 2 ริชาร์ดสัน คุณกำลังอ้างถึงในระดับ 3 เพียงยอมรับ REST เป็นสิ่งที่นำมาใช้อย่างต่อเนื่อง
Jules Randolph

1
@Jules Randolph - ขอโทษคำตอบของฉันถูกเขียนเพียงไม่กี่เดือนหลังจากรูปแบบวุฒิภาวะของ Richardson ได้รับการประกาศเกียรติคุณเป็นครั้งแรกและก่อนที่ Martin Fowler และผู้เขียนคนอื่นจะนิยมมัน :) แน่นอนว่ามันเป็นแบบจำลองที่ให้คำแนะนำ อย่าลังเลที่จะแก้ไขคำตอบ
aehlke

1

แม้ว่าฉันจะชอบคำตอบของจัสติน แต่ฉันก็รู้สึกว่ามันหมายถึงตัวกรองมากกว่าการค้นหา ถ้าฉันต้องการทราบเกี่ยวกับรถยนต์ที่มีชื่อขึ้นต้นด้วย cam

วิธีที่ฉันเห็นคุณสามารถสร้างมันขึ้นมาในแบบที่คุณจัดการกับทรัพยากรเฉพาะ:
/ cars / cam *

หรือคุณสามารถเพิ่มมันเข้าไปในตัวกรอง:
/ cars / doors / 4 / name / cam * / cols / red สีน้ำเงิน, เขียวโดย

ส่วนตัวแล้วฉันชอบสิ่งที่ตามหลัง แต่ฉันไม่เคยเป็นผู้เชี่ยวชาญเรื่อง REST (หลังจากได้ยินครั้งแรกเมื่อ 2 สัปดาห์ก่อนเท่านั้น ... )


เช่นนี้:/cars?name=cam*
DanMan

1

RESTful ไม่แนะนำให้ใช้คำกริยาใน URL / cars / search ของ URL ไม่ได้พักผ่อน วิธีที่ถูกต้องในการกรอง / ค้นหา / ให้เลขหน้า API ของคุณคือผ่านพารามิเตอร์การสืบค้น อย่างไรก็ตามอาจมีบางกรณีที่คุณต้องฝ่าฝืนกฎเกณฑ์ ตัวอย่างเช่นหากคุณค้นหาข้ามหลายแหล่งข้อมูลคุณต้องใช้สิ่งที่ต้องการ / search? q = query

คุณสามารถเข้าไปที่http://saipraveenblog.wordpress.com/2014/09/29/rest-api-best-practices/เพื่อทำความเข้าใจแนวปฏิบัติที่ดีที่สุดสำหรับการออกแบบ RESTful API


1
ค้นหาคำนามด้วยเช่นกัน😀
jith912

1

นอกจากนี้ฉันอยากจะแนะนำ:

/cars/search/all{?color,model,year}
/cars/search/by-parameters{?color,model,year}
/cars/search/by-vendor{?vendor}

ที่นี่Searchถือเป็นทรัพยากรย่อยของCarsทรัพยากร


1

มีตัวเลือกที่ดีมากมายสำหรับกรณีของคุณที่นี่ ยังคุณควรพิจารณาการใช้เนื้อหาของ POST

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

สิ่งนี้ช่วยให้คำอธิบายที่ยืดหยุ่นยิ่งขึ้นของการค้นหารวมถึงหลีกเลี่ยงการจำกัดความยาวของ URL ของเซิร์ฟเวอร์


-4

คำแนะนำของฉันคือ:

/garages
  Returns list of garages (think JSON array here)
/garages/yyy
  Returns specific garage
/garage/yyy/cars
  Returns list of cars in garage
/garages/cars
  Returns list of all cars in all garages (may not be practical of course)
/cars
  Returns list of all cars
/cars/xxx
  Returns specific car
/cars/colors
  Returns lists of all posible colors for cars
/cars/colors/red,blue,green
  Returns list of cars of the specific colors (yes commas are allowed :) )

แก้ไข:

/cars/colors/red,blue,green/doors/2
  Returns list of all red,blue, and green cars with 2 doors.
/cars/type/hatchback,coupe/colors/red,blue,green/
  Same idea as the above but a lil more intuitive.
/cars/colors/red,blue,green/doors/two-door,four-door
  All cars that are red, blue, green and have either two or four doors.

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

นี่คือลิงค์ไปยังหน้าอธิบายความชั่วร้ายของสตริงการสืบค้นใน REST: http://web.archive.org/web/20070815111413/http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful

ฉันใช้แคชของ Google เพราะหน้าปกติไม่ทำงานสำหรับฉันที่นี่คือลิงก์นั้นด้วย: http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful


1
ขอบคุณสำหรับคำตอบโดยละเอียด ในอันสุดท้ายถ้าฉันต้องการค้นหาทั้งสีและจำนวนประตูล่ะ / รถยนต์ / สี / แดง, น้ำเงิน, เขียว / ประตู / 4 ที่ดูไม่ถูกต้อง
Parand

2
เครื่องหมายจุลภาคใน URL ไม่ถูกต้องสำหรับฉัน แต่ก็ยังเหลือที่ถูกต้อง ฉันคิดว่ามันเป็นเพียงการเปลี่ยนกระบวนทัศน์
Justin Bozonier

21
ฉันไม่ชอบคำแนะนำนี้ คุณจะรู้ความแตกต่างระหว่าง/cars/colors/red,blue,greenและ/cars/colors/green,blue,redอย่างไร องค์ประกอบเส้นทางของ URI ควรเป็นลำดับชั้นและฉันไม่เห็นว่าเป็นอย่างนี้ ฉันคิดว่านี่เป็นสถานการณ์ที่แบบสอบถามสตริงเป็นตัวเลือกที่เหมาะสมที่สุด
troelskn

62
นี่เป็นคำตอบที่ไม่ดี ในความเป็นจริงวิธีที่เหมาะสมในการใช้การค้นหาคือการใช้สตริงการสืบค้น สตริงการสืบค้นจะไม่ชั่วร้ายเพียงเล็กน้อยเมื่อใช้อย่างถูกต้อง บทความที่อ้างถึงไม่ได้หมายถึงการค้นหา ตัวอย่างที่ให้มานั้นถูกทรมานอย่างชัดเจนและจะไม่ทนกับพารามิเตอร์มากขึ้น
pbreitenbach

4
querystrings ถูกสร้างขึ้นเพื่อแก้ไขปัญหาการสืบค้นทรัพยากรเป็นหลักแม้จะมีพารามิเตอร์หลายตัวก็ตาม การบิดเบือน URI เพื่อเปิดใช้งาน API "RESTful" ดูเหมือนจะอันตรายและสายตาสั้นโดยเฉพาะอย่างยิ่งเนื่องจากคุณต้องเขียนการแมปที่ซับซ้อนของคุณเองเพื่อจัดการกับการเปลี่ยนแปลงของพารามิเตอร์ต่างๆใน URI ยังดีกว่าใช้แนวคิดที่มีอยู่แล้วของการใช้เครื่องหมายอัฒภาคใน URIs ของคุณ: doriantaylor.com/policy/http-url-path-par-- พารามิเตอร์
Anatoly G
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.