Eu tenho tido um debate sobre o que fazer com uma barra final em uma API RESTful.
Digamos que eu tenho um recurso chamado cães e recursos subordinados para cães individuais. Podemos, portanto, fazer o seguinte:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Mas o que fazemos com o seguinte caso especial:
GET/PUT/POST/DELETE http://example.com/dogs/
Minha opinião pessoal é que isso significa enviar uma solicitação para um recurso individual de cão com id = null
. Eu acho que a API deve retornar um 404 para este caso.
Outros dizem que a solicitação está acessando o recurso dogs, ou seja, a barra final é ignorada.
Alguém sabe a resposta definitiva?
dogs
edogs/
como equivalente. Para mim, é claro quedogs/
é um diretório que contém os cães individuais. É menos claro o quedogs
é, mas eu trataria isso como equivalente, assim como a maioria dos servidores da Web aceita acessos a diretórios sem o rastreamento/
.Respostas:
Nada disso é autoritário (como REST não tem significado exato). Porém, no artigo original no REST, uma URL completa (que não termina em /) nomeia um recurso, enquanto uma terminada em uma barra '/' é um grupo de recursos (provavelmente não redigido dessa maneira).
Um GET de um URL com uma barra no final deve listar os recursos disponíveis.
Uma PUT em uma URL com uma barra deve substituir todos os recursos.
Um DELETE em um URL com uma barra deve excluir todos os recursos
Um POST em uma URL com uma barra deve criar um novo recurso e pode ser acessado posteriormente. Para estar em conformidade, o novo recurso deve estar neste diretório (embora muitas arquiteturas RESTful trapaceiem aqui).
etc.
A página wiki sobre o assunto parece explicar bem:
Veja o exemplo https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
fonte
/
/
?GET http://example.com/dogs
pode retornar meta informações sobre os cães (não a lista em si, mas meta informações sobre a lista de cães). Talvez ou talvez seja um erro.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.
Este não é o único lugar que sugerem a não usar barra de treinamentoNão existe um, pois não existe um documento oficial sobre o que é necessário para um serviço ser considerado RESTful.
Dito isto, eu permitiria a barra final simplesmente para facilitar o uso. Enquanto tecnicamente falando, isso pode ser visto como uma tentativa de acessar um cão com um ID nulo; Não vejo um usuário fazendo esse salto, a menos que o tenha lido na sua documentação. Posso ver um usuário tentando escrever código na sua API e incluindo a barra à direita simplesmente por hábito e me perguntando por que eles recebem uma resposta 404 quando desejam uma lista de cães.
fonte
example.com/dogs
é um recurso completamente independente de qualquer recursoexample.com/dogs/X
. Portanto, um DELETE onexample.com/dogs
não precisa excluir todos os cães / * (embora possa ser essa semântica). Mas DELETEexample.com/dogs/
deve excluir todos os cães / *.foo
,foo/
efoo////
de forma idêntica. Basicamente, parece remover segmentos de caminho vazios. Portanto, se você seguir a mesma abordagem com o serviço RESTdogs
edogs/
se referir à mesma coisa.Dois caminhos.
Método 1
Sempre use barras finais para qualquer recurso que possa conter filhos.
Considere "GET" em um diretório public_html com arquivos.
Não é possível quando hello.html é um arquivo:
Mas possível quando hello.html for um diretório:
Portanto, se "hello.html" puder ter filhos, será sempre e para sempre "/hello.html/" e "/hello.html/index.html" (ou simplesmente /hello.html/) é uma lista desses filhos .
Método 2
Seja esperto".
O comando find não se importa com o tipo de hello.html. Diretório ou arquivo, quem se importa, é o nome de um objeto. Quando escrevemos "cp youagain.html hello.html", o cp pode descobrir como lidar com hello.html. cp é inteligente. Seu servidor da web também é inteligente. Possui uma biblioteca de manipulação de caminhos. Tem roteamento. Ele pode declarar e informar se um nome é um objeto ou um diretório. Ele pode redirecionar blá para blá / ou até mesmo servir a mesma resposta para ambos. Este é o incrível !!! maneira. Tanta tecnologia. Quem iria querer simplesmente concatenar cadeias de caminho quando pudéssemos fazer tudo isso ???
fonte