Dyskutowałem o tym, co zrobić z końcowym ukośnikiem w interfejsie API RESTful.
Powiedzmy, że mam zasób zwany psami i zasoby podrzędne dla poszczególnych psów. Możemy zatem wykonać następujące czynności:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Ale co robimy w następującym specjalnym przypadku:
GET/PUT/POST/DELETE http://example.com/dogs/
Moim osobistym zdaniem jest to, że oznacza to wysłanie żądania do pojedynczego zasobu psa o id = null
. Myślę, że interfejs API powinien zwrócić 404 dla tego przypadku.
Inni twierdzą, że żądanie dostępu do zasobu psów, tzn. Ukośnik końcowy jest ignorowany.
Czy ktoś zna ostateczną odpowiedź?
dogs
idogs/
jako równoważny. Dla mnie jasnedogs/
jest, że jest to katalog zawierający poszczególne psy. Jest mniej jasne, codogs
jest, ale traktowałbym to jako równoważne, tak jak większość serwerów akceptuje dostęp do katalogów bez końcowego/
.Odpowiedzi:
Nic z tego nie jest wiarygodne (ponieważ REST nie ma dokładnego znaczenia). Ale z oryginalnego artykułu na temat REST pełny (nie kończący się na /) adres URL nazywa zasób, podczas gdy jeden kończący się ukośnikiem „/” to grupa zasobów (prawdopodobnie nie tak sformułowana).
GET adresu URL z ukośnikiem na końcu powinien zawierać listę dostępnych zasobów.
PUT na adres URL z ukośnikiem ma zastąpić wszystkie zasoby.
DELETE na adresie URL z ukośnikiem ma usunąć wszystkie zasoby
Następnie można uzyskać dostęp do POST na adresie URL z ukośnikiem, aby utworzyć nowy zasób. Aby zachować zgodność, nowy zasób powinien znajdować się w tym katalogu (chociaż wiele oszustw RESTful tutaj oszukuje).
itp.
Strona wiki na ten temat wydaje się to dobrze wyjaśniać:
Zobacz przykład https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
źródło
/
/
?GET http://example.com/dogs
może zwracać meta informacje o psach (nie samą listę, ale meta informacje o liście psów). Może, a może to błąd.As the last character within a URI’s path, a forward slash (/) adds no semantic value and may cause confusion. It’s better to drop them completely.
To nie jedyne miejsce, które sugeruje, aby nie używać slash treningowyNie ma takiego, ponieważ nie ma oficjalnego dokumentu, który jest wymagany, aby usługa mogła zostać uznana za RESTful.
To powiedziawszy, ze pozwolę na końcowe cięcie po prostu dla łatwości użycia. Technicznie rzecz biorąc, może to być postrzegane jako próba uzyskania dostępu do psa z zerowym identyfikatorem; Nie widzę, żeby użytkownik wykonywał ten skok, chyba że przeczytał go w twojej dokumentacji. Widzę, że użytkownik próbuje napisać kod przeciw Twojemu API i dołącza ukośnik po prostu z przyzwyczajenia i zastanawia się, dlaczego otrzyma odpowiedź 404, gdy chce listy psów.
źródło
example.com/dogs
jest zasób całkowicie niezależny od dowolnego zasobuexample.com/dogs/X
. Dlatego DELETE onexample.com/dogs
nie musi usuwać wszystkich psów / * (choć może, jeśli jest to semantyka). Ale DELETEexample.com/dogs/
powinno usunąć wszystkie psy / *.foo
,foo/
ifoo////
identycznie. Zasadniczo wydaje się, że usuwa puste segmenty ścieżki. Jeśli więc zastosujesz to samo podejście do usługi RESTdogs
idogs/
odniesiesz się do tego samego.Dwie drogi.
Metoda 1
Zawsze używaj końcowych ukośników dla każdego zasobu, który może zawierać dzieci.
Rozważ „GET” w katalogu public_html z plikami.
Nie jest możliwe, gdy plik hello.html jest plikiem:
Ale możliwe, gdy hello.html jest katalogiem:
Jeśli więc „hello.html” może kiedykolwiek mieć dzieci, to zawsze jest to „/hello.html/” i „/hello.html/index.html” (lub po prostu /hello.html/) to lista tych dzieci .
Metoda 2
Bądź mądry".
Polecenie find nie przejmuje się typem hello.html. Katalog lub plik, kogo to obchodzi, to nazwa obiektu. Kiedy piszemy „cp youagain.html hello.html”, cp może dowiedzieć się, jak obsługiwać hello.html. cp jest mądry. Twój serwer również jest inteligentny. Ma bibliotekę do obsługi ścieżek. Ma routing. Może stat i powiedzieć, czy nazwa jest obiektem czy katalogiem. Może przekierowywać bla na bla / lub nawet po prostu podawać tę samą odpowiedź dla obu. To jest niesamowite !!! droga. Tyle techniki. Kto kiedykolwiek chciałby po prostu połączyć łańcuchy ścieżek, kiedy moglibyśmy to wszystko zrobić?
źródło