Paieška RESTful URL Design

Aš ieškau tinkamo būdo pateikti paieškas kaip atnaujinamą URL.

Nustatymas: Turiu du modelius, automobilius ir garažus, kur automobiliai gali būti garažuose. Taigi mano URL atrodo taip:

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

Automobilis gali egzistuoti atskirai (iš čia / automobilyje), arba jis gali būti garaže. Kas yra teisingas būdas įsivaizduoti visus automobilius tam tikrame garaže? Kažkas panašaus:

 /garage/yyy/cars ? 

Kaip sujungti automobilius yyy ir zzz garažuose?

Koks yra tinkamas būdas pateikti paiešką automobiliams su tam tikrais atributais? Pasakykite: parodyti man visus mėlynus sedanus su 4 durimis:

 /car/search?color=blue> 

ar turėtų būti / automobiliai?

„Paieškos“ naudojimas atrodo netinkamas - kas yra geriausias būdas / terminas? Ar tai turėtų būti:

 /cars/?color=blue> 

Ar paieškos parametrai turėtų būti PATHINFO arba QUERYSTRING?

Trumpai tariant, ieško gero vadovo / vadovo, skirto kryžminio modelio REST URL paieškai ir paieškai.

[Atnaujinti] Man patinka Justino atsakymas, tačiau jis neapima daugelio žaidėjų paieškos:

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

ar kažkas panašaus. Kaip pereiti nuo

 /cars/color/blue 

daugelio laukų atveju?

364
16 окт. Parand yra spalio 16 d. 2008-10-16 07:51 '08 at 7:51 am 2008-10-16 07:51
@ 12 atsakymų

Jei norite ieškoti, naudokite užklausų eilutes. Tai labai gražus:

 /cars?color=blue> 

Reguliarių užklausų privalumas yra tas, kad jie yra standartiniai ir plačiai suprantami ir kad jie gali būti generuojami iš gaunamos formos.

375
04 июля '09 в 10:13 2009-07-04 10:13 atsakymas pateikiamas pbreitenbachas liepos 4 d., 09 val. 10:13 2009-07-04 10:13

RESTful“ URL dizainas - tai struktūra, pagrįsta struktūra (struktūra, tokia kaip direktorija, data: straipsniai / -id , objektas ir atributai, ..), brūkšnys / nurodo hierarchinę struktūrą, -id naudokite -id .

Hierarchinė struktūra

Norėčiau:

 /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 #I don't recommend using > 

Arba iš esmės nieko, kas yra ne brūkšnys, kaip aprašyta aukščiau.
Formulė: /cars[?;]color[=-:]blue[,;+> , * nors nenorėčiau naudoti „ženklo“, nes ji iš pirmo žvilgsnio nepripažįstama iš teksto.

** Ar žinojote, kad JSON objekto perdavimas URI yra atkuriamas? **

Parinkčių sąrašai

Galimos funkcijos?

Atšaukti paieškos eilutes (!)
Ieškoti bet kokių automobilių, bet ne juodos ir raudonos spalvos:
?color=!black,!red
color:(!black,!red)

Paieškos užklausų registravimas
Ieškokite raudonų arba mėlynų arba juodų automobilių su 3 durimis garažuose id 1..20 arba 101..103 arba 999, bet ne 5 /garage[id=1-20,101-103,999,!5]/cars[color=red,blue,black;doors=3]
Tada galite sukurti sudėtingesnes paieškos užklausas. (Pažvelkite į CSS3 atributų nuoseklumą, kad pamatytumėte pagrindinio teksto idėją. Pavyzdžiui, ieškokite naudotojų, kuriuose yra bar user*=bar .

Išvada

Bet kokiu atveju tai gali būti svarbiausia jūsų dalis, nes jūs galite tai padaryti taip, kaip jums patinka, tiesiog nepamirškite, kad NEKILNOJAMAS URI yra struktūra, kuri yra lengvai suprantama, pavyzdžiui. /directory/file , /collection/node/item , datos /articles/{year}/{month}/{day} . Ir kai paliksite bet kurį iš paskutinių segmentų, tuoj pat žinai, ką gaunate.

Taigi visi šie simboliai leidžiami nekoduoti :

  • be rezervo a-zA-Z0-9_.-~
  • rezervuota:; ;/?:@=>
  • nesaugus *: <>"#%{}|\^~[]`

* Kodėl tai yra nesaugu ir kodėl geriau koduoti: RFC 1738 cm 2.2

RFC 3986 žr. 2.2
Nepaisant to, ką sakiau anksčiau, yra bendras metrikų skirtumas, o tai reiškia, kad kai kurie yra svarbesni nei kiti.

  • bendri ribotojai :: :/?#[]@
  • sub-delimeters :! !$> ,; !$>

Daugiau informacijos:
Hierarchija: žr. 2.3 , žr. 1.2.3
URL kelio parametrų sintaksė
CSS3 atributo atitikimas
IBM: „RESTful Web Services“ - pagrindai
Pastaba: RFC 1738 buvo atnaujintas į RFC 3986.

106
15 марта '13 в 16:10 2013-03-15 16:10 atsakymas pateiktas „ Qwerty“ kovo 15 d. 13 val. 16:10 2013-03-15 16:10

Nors kelio galimybės turi tam tikrų pranašumų, yra IMO, kai kurie viršsvorio veiksniai.

  • URL nėra leidžiami visi paieškos užklausai reikalingi simboliai. Dauguma skyrybos ženklų ir Unicode simbolių turi būti užkoduoti URL kaip užklausos eilutės parametras. Aš kovoju su ta pačia problema. Norėčiau naudoti „XPath“ URL, bet ne visa „XPath“ sintaksė yra suderinama su URI kontūru. Todėl paprastiems /cars/doors/driver/lock/combination keliams patartina rasti „ combination “ elementą vairuotojo durų XML dokumente. Tačiau /car/doors[id='driver' and lock/combination='1234'] nėra labai draugiškas.

  • Yra skirtumas tarp išteklių filtravimo pagal vieną iš jo atributų ir išteklių nurodymą.

    Pavyzdžiui, nes

    /cars/colors grąžina visų spalvų sąrašą visiems automobiliams (grąžintas šaltinis yra spalvotų objektų rinkinys)

    /cars/colors/red,blue,green grąžins spalvotų objektų sąrašą, kuris yra raudonas, mėlynas arba žalias, o ne automobilių rinkinys.

    Norėdami grąžinti automobilius, kelias bus

    /cars?color=red,blue,green arba /cars/search?color=red,blue,green

  • Kelio parametrus sunkiau skaityti, nes vardo / vertės poros nėra izoliuotos nuo likusios kelio dalies, kurios nėra vardo / vertės poros.

Paskutinis komentaras. Norėčiau /garages/yyy/cars (visada daugiskaita) į /garage/yyy/cars (galbūt tai buvo pirminio atsakymo klaidos), nes vengiama keisti kelią tarp vienaskaitos ir daugiskaitos. Įtraukus žodžius su „s“, pokytis nėra toks blogas, tačiau /person/yyy/friends /people/yyy atrodo sudėtinga.

34
29 мая '09 в 18:48 2009-05-29 18:48 atsakymą pateikė „ Doug Domeny “ gegužės 29 d., 09:18, 2009-05-29 18:48

Norėdami išplėsti Petro atsakymą, galite atlikti paiešką pirmos klasės ištekliais:

 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) 

Išteklių paieškoje bus laukai, skirti spalvai, modeliui, garažui ir pan. ir gali būti nurodyta XML, JSON arba bet kokiu kitu formatu. Kaip automobilio ir garažo išteklius galite apriboti prieigą prie paieškos užklausų pagal autentifikavimą. Vartotojai, kurie dažnai pradeda tas pačias paieškos užklausas, gali juos išsaugoti savo profiliuose, kad juos nereikėtų atkurti. URL bus pakankamai trumpi, kad daugeliu atvejų jie būtų lengvai parduodami el. Paštu. Šios išsaugotos paieškos gali būti pritaikytų RSS kanalų ir tt pagrindas.

Yra daug galimybių ieškoti, kai manote apie juos kaip išteklius.

Ši idėja išsamiau paaiškinta šioje „ Railscast“ programoje .

30
29 мая '09 в 19:03 2009-05-29 19:03 atsakymą pateikė „ Rich Apodaca “ gegužės 29 d., 09:03 2009-05-29 19:03

Justino atsakymas tikriausiai yra būdas, nors kai kuriose programose gali būti tikslinga apsvarstyti konkrečią paiešką kaip atskirą šaltinį, pvz., Jei norite palaikyti nurodytas išsaugotas paieškas:

 /search/{searchQuery} 

arba

 /search/{savedSearchName} 
11
16 окт. Atsakymą pateikė Peter Hilton spalio 16 d. 2008-10-16 13:52 '08, 13:52 pm 2008-10-16 13:52

Tai nėra REST. Negalite nustatyti savo API išteklių URI. Išteklių navigacija turėtų būti valdoma hipertekstu. Tai gerai, jei jums reikia gražių URI ir kietos nuorodos, bet ne tik vadiname „REST“, nes ji tiesiogiai pažeidžia „RESTful“ architektūros apribojimus.

Žr. „REST išradėjo straipsnį.

5
20 июля '09 в 21:52 2009-07-20 21:52 atsakymą pateikė aehlke liepos 20 d. 09:21 21:52 2009-07-20 21:52

Įgyvendindamas paiešką, naudoju du metodus.

1) Paprasčiausias atvejis, kai reikia užklausų dėl susijusių elementų ir naršyti.

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

Tai reiškia, kad prašomi automobiliai su garažo ID, lygus 1.

Taip pat galima sukurti sudėtingesnes užklausas:

  /cars?q.garage.street.eq=FirstStreet> 

Automobiliai visuose „FirstStreet“ garažuose, kurie nėra raudoni (3-as puslapis, 100 vienetų puslapyje).

2) Kompleksinės užklausos laikomos paprastais ištekliais, kurie yra sukurti ir gali būti atkurti.

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

POST įstaiga paieškai sukurti yra tokia:

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

Jis pagrįstas „Grails“ (DSL kriterijai): http://grails.org/doc/2.4.3/ref/Domain%20Classes/createCriteria.html

4
10 окт. atsakymas, kurį pateikė user2108278 Oct 10. 2014-10-10 17:23 '14, 17:23, 2014-10-10 17:23

Nors man patinka Justino atsakymas, manau, kad jis tiksliau atspindi filtrą, o ne paiešką. Ką daryti, jei noriu sužinoti apie mašinas su vardais, kurie prasideda nuo fotoaparato?



Matydamas, galite ją sukurti taip, kaip tvarkote tam tikrus išteklius:

/ Automobiliai / F *



Arba galite tiesiog pridėti jį prie filtro:

/ Automobiliai / Durys / 4 / Pavadinimas / Kamera * / Spalva / Raudona, Mėlyna, Žalia



Asmeniškai aš pirmenybę teikiu pastarajam, bet jokiu būdu nesu „REST“ ekspertas (apie tai pirmą kartą girdėjau tik prieš 2 ar daugiau savaičių ...)

1
04 марта '09 в 18:02 2009-03-04 18:02 atsakymas duotas „ Nate“ kovo 04 d., 09:18, 2009-03-04 18:02

Be to, taip pat norėčiau pasiūlyti:

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

Čia Search laikoma vaiko išteklių vaiko ištekliumi.

0
13 янв. atsakymą pateikė aux 13 jan. 2016-01-13 00:49 '16 ne 0:49 2016-01-13 00:49

Jūsų verslui yra daug gerų galimybių. Tačiau turėtumėte apsvarstyti galimybę naudoti POST įstaigą.

Užklausos eilutė puikiai tinka jūsų pavyzdžiui, bet, pavyzdžiui, jei turite kažką sudėtingesnio. savavališkas ilgas elementų arba loginių sąlyginių išraiškų sąrašas, galite nustatyti įrašą kaip dokumentą, kurį klientas siunčia per POST.

Tai leidžia atlikti lankstesnį paieškos aprašymą ir taip pat išvengiama serverio URL ilgio ribojimo.

0
15 сент. atsakymą pateikė estani 15 sep . 2017-09-15 17:45 '17, 17:45 pm 2017-09-15 17:45

„RESTful“ nerekomenduoja naudoti veiksmažodžių URL / automobiliuose / paieška neramina. Teisingas būdas filtruoti / ieškoti / paginuoti savo API atliekamas naudojant užklausos parametrus. Tačiau gali būti kartų, kai jūs turite nutraukti normą. Pvz., Jei atliekate paiešką keliais ištekliais, turėtumėte naudoti kažką panašaus į / q? Užklausa = /

Jei norite suprasti geriausius API kūrimo metodus, galite apsilankyti adresu http://saipraveenblog.wordpress.com/2014/09/29/rest-api-best-practices/ .

0
06 окт. atsakymas, kurį pateikė java_geek 06 spalis 2014-10-06 09:53 '14 at 9:53 2014-10-06 09:53

Mano patarimai būtų:

 /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 :) ) 

Redaguoti:

 /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. 

Tikiuosi, kad tai suteiks jums šią idėją. Tiesą sakant, jūsų „Rest API“ turėtų būti lengvai ieškoma ir turėtų leisti peržiūrėti duomenis. Kitas privalumas, naudojant URL, o ne užklausų eilutes, yra tai, kad galite naudoti savo „caching“ mechanizmus, kurie yra žiniatinklio serveryje HTTP srautui.

Čia yra nuoroda į puslapį, kuriame aprašomi užklausos eilutės trūkumai REST: http://web.archive.org/web/20070815111413/http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful

Aš naudoju „Google“ talpyklą, nes įprastas puslapis man čia nedirbo, ši nuoroda: http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful

-3
16 окт. Atsakymą pateikė Justin Bozonier spalio 16 d. 2008-10-16 08:03 '08, 08:03 2008-10-16 08:03

Kiti klausimai dėl žymių arba Užduoti klausimą