Eu sou novo no REST e observei que em alguns serviços RESTful eles usam URI de recursos diferentes para atualizar / obter / excluir e Criar. Tal como
- Criar - usando / recursos com o método POST (observe o plural) em alguns lugares usando / resource (singular)
- Atualização - usando / resource / 123 com o método PUT
- Obter - Usando / resource / 123 com o método GET
Estou um pouco confuso sobre esta convenção de nomes de URI. O que devemos usar no plural ou no singular para criação de recursos? Quais devem ser os critérios ao decidir isso?
rest
resources
naming-conventions
uri
JPReddy
fonte
fonte
Respostas:
A premissa de usar
/resources
é que ele representa "todos" os recursos. Se você fizer umGET /resources
, provavelmente retornará a coleção inteira. Ao postar em/resources
, você está adicionando à coleção.No entanto, os recursos individuais estão disponíveis em / resource. Se você fizer um
GET /resource
, provavelmente cometerá um erro, pois essa solicitação não faz nenhum sentido, enquanto/resource/123
faz todo o sentido.Usando
/resource
vez de/resources
é semelhante à forma como você faria isso se estivesse a trabalhar com, digamos, um sistema de arquivos e uma coleção de arquivos e/resource
é o "diretório" com o indivíduo123
,456
arquivos nele.De nenhuma maneira é certo ou errado, escolha o que você mais gosta.
fonte
Para mim, é melhor ter um esquema que você possa mapear diretamente para o código (fácil de automatizar), principalmente porque o código é o que será nas duas extremidades.
fonte
Também não vejo sentido em fazer isso e acho que não é o melhor design de URI. Como usuário de um serviço RESTful, eu esperaria que o recurso da lista tivesse o mesmo nome, independentemente de acessar a lista ou o recurso específico 'na' lista. Você deve usar os mesmos identificadores, independentemente de querer usar o recurso de lista ou um recurso específico.
fonte
Plural
orders/
obtém uma lista de pedidos de índice.Por exemplo:
GET /resources
- retorna uma lista de itens de recursosPOST /resources
- cria um ou muitos itens de recursosPUT /resources
- atualiza um ou muitos itens de recursosPATCH /resources
- atualiza parcialmente um ou muitos itens de recursosDELETE /resources
- exclui todos os itens de recursosE para itens de recurso único:
GET /resources/:id
- retorna um item de recurso específico com base no:id
parâmetroPOST /resources/:id
- cria um item de recurso com o ID especificado (requer validação)PUT /resources/:id
- atualiza um item de recurso específicoPATCH /resources/:id
- atualiza parcialmente um item de recurso específicoDELETE /resources/:id
- exclui um item de recurso específicoPara os defensores do singular, pense dessa maneira: você pediria a alguém
order
e esperaria uma coisa ou uma lista de coisas? Então, por que você esperaria que um serviço retornasse uma lista de itens ao digitar/order
?fonte
Order
é um bom nome para uma classe que lida com instâncias singulares de objetos referentes a uma ordem.OrderList
é um nome para uma classe que lida com váriasOrder
instâncias.Orders Table
é um bom nome para uma tabela de banco de dados de muitos pedidos.Singular
Conveniência As coisas podem ter nomes irregulares no plural. Às vezes eles não têm um. Mas nomes singulares estão sempre lá.
por exemplo, CustomerAddress sobre CustomerAddresses
Considere este recurso relacionado.
Isso
/order/12/orderdetail/12
é mais legível e lógico do que/orders/12/orderdetails/4
.Tabelas de banco de dados
Um recurso representa uma entidade como uma tabela de banco de dados. Deve ter um nome singular lógico. Aqui está a resposta sobre os nomes das tabelas.
Mapeamento de Classes
As aulas são sempre singulares. As ferramentas ORM geram tabelas com os mesmos nomes dos nomes de classe. À medida que mais e mais ferramentas estão sendo usadas, nomes singulares estão se tornando um padrão.
Leia mais sobre o dilema de um desenvolvedor de API REST
fonte
/clothe/12/trouser/34
:)clothe
é um verbo. As APIs de descanso geralmente se atêm aos substantivos ao falar sobre recursos e usam verbos ao descrever ações. A forma singular éclout
, mas é arcaica e provavelmente seria mais adequadamente substituída porgarment
.Enquanto a prática mais prevalente são as APIs RESTful onde plurais são usados
/api/resources/123
, por exemplo , há um caso especial em que considero o uso de um nome singular mais apropriado / expressivo do que nomes plurais. É o caso dos relacionamentos um-para-um. Especificamente, se o item de destino for um objeto de valor (no paradigma de design controlado por domínio).Vamos supor que todo recurso tenha um um para um,
accessLog
que pode ser modelado como um objeto de valor, ou seja, não uma entidade, portanto, sem ID. Pode ser expresso como/api/resources/123/accessLog
. Os verbos usuais (POST, PUT, DELETE, GET) expressariam adequadamente a intenção e também o fato de que o relacionamento é realmente um para um.fonte
GET /users/123/location
deve buscar o local em que o usuário trabalha. Não éGET /users/123/locations
realmente enganoso como consumidor?accessLog
é modelado como um atributo ou valor, em vez de uma entidade, deve ser singular. Se você tiver excesso de engenharia, uma entrada de log seria uma entidade e você o faria/api/accessLogEntries?resource=123
.Por que não seguir a tendência predominante dos nomes de tabelas de banco de dados, onde geralmente é aceito um formulário singular? Estive lá, fiz isso - vamos reutilizar.
Dilema de nomeação de tabela: nomes singulares vs. plurais
fonte
Estou surpreso ao ver que tantas pessoas pulariam no substantivo plural bandwagon. Ao implementar conversões no singular para o plural, você cuida de substantivos no plural irregulares? Você gosta de dor?
Consulte http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm
Existem muitos tipos de plural irregular, mas estes são os mais comuns:
Tipo substantivo Formando o plural Exemplo
fonte
Da perspectiva do consumidor da API, os pontos de extremidade devem ser previsíveis para que
Idealmente...
GET /resources
deve retornar uma lista de recursos.GET /resource
deve retornar um código de status de 400 níveis.GET /resources/id/{resourceId}
deve retornar uma coleção com um recurso.GET /resource/id/{resourceId}
deve retornar um objeto de recurso.POST /resources
o lote deve criar recursos.POST /resource
deve criar um recurso.PUT /resource
deve atualizar um objeto de recurso.PATCH /resource
deve atualizar um recurso postando apenas os atributos alterados.PATCH /resources
Os recursos de atualização em lote devem postar apenas os atributos alterados.DELETE /resources
deve excluir todos os recursos; brincando: código de status 400DELETE /resource/id/{resourceId}
Essa abordagem é a mais flexível e rica em recursos, mas também a que consome mais tempo. Portanto, se você estiver com pressa (o que é sempre o caso do desenvolvimento de software), apenas nomeie seu endpoint
resource
ou a forma pluralresources
. Eu prefiro a forma singular, pois oferece a opção de examinar e avaliar programaticamente, pois nem todas as formas plurais terminam em 's'.Dito tudo isso, por qualquer motivo que o desenvolvedor da prática mais comumente escolhido tenha escolhido é usar a forma plural. Esta é finalmente a rota que eu escolhi e se você olhar as APIs populares como
github
etwitter
, é isso que elas fazem.Alguns critérios para decidir podem ser:
Então a escolha é sua. Seja o que for que seja consistente.
fonte
POST /users
deve criar um único usuário, adicionando-o à coleção. Discordo.POST /users
deve criar uma lista de usuários (mesmo que seja uma lista de 1), onde tambémPOST /user
deve criar exatamente um usuário. Não vejo razão para que os pontos de extremidade do recurso plural e singular não possam coexistir. Eles descrevem comportamentos diferentes e não devem surpreender ninguém de sua função.POST users/<id>
criaria um novo usuário.PUT /users/<id>
vez dePOST
.POST
tem a interpretação "adicione isso à coleção e determine o ID como parte disso".PUT
tem a interpretação "atualizar (ou adicionar) esse recurso com esse ID". Consulte restcookbook.com/HTTP%20Methods/put-vs-post para obter uma explicação mais detalhada desse princípio.Meus dois centavos: métodos que passam seu tempo mudando do plural para o singular ou vice-versa são um desperdício de ciclos de CPU. Eu posso ser da velha escola, mas na minha época as coisas eram chamadas da mesma forma. Como procuro métodos relacionados a pessoas? Nenhuma expressão regular cobre pessoas e pessoas sem efeitos colaterais indesejáveis.
Os plurais em inglês podem ser muito arbitrários e sobrecarregam o código desnecessariamente. Atenha-se a uma convenção de nomenclatura. As linguagens de computador deveriam ter clareza matemática, não imitar a linguagem natural.
fonte
Eu prefiro usar a forma singular para simplicidade e consistência.
Por exemplo, considerando o seguinte URL:
/ cliente / 1
Tratarei o cliente como uma coleção de clientes, mas por simplicidade, a parte da coleção é removida.
Outro exemplo:
/ equipamento / 1
Nesse caso, equipamentos não é a forma plural correta. Portanto, tratá-lo como uma coleção de equipamentos e remover a coleção por simplicidade torna-o consistente com o caso do cliente.
fonte
POST /customer
deveria fazer exatamente isso - inserir um único cliente?POST /customer
lê para mim como se estivesse postando para othe
cliente. Não é uma coleção de clientes. No entanto, admito que Plural ou não Plural é uma preferência. Contanto que eles não sejam misturados como a outra Resposta. Isso seria incrivelmente confuso.Um ID em uma rota deve ser exibido da mesma forma que um índice para uma lista e a nomeação deve prosseguir de acordo.
Mas alguns recursos não usam IDs em suas rotas porque há apenas um ou um usuário nunca tem acesso a mais de um, portanto, essas não são listas:
fonte
Nas convenções de nomenclatura, geralmente é seguro dizer "apenas escolha uma e cumpra-a", o que faz sentido.
No entanto, depois de ter que explicar o REST para muitas pessoas, representar os pontos de extremidade como caminhos em um sistema de arquivos é a maneira mais expressiva de fazê-lo.
É sem estado (os arquivos existem ou não existem), hierárquico, simples e familiar - você já sabe como acessar arquivos estáticos, localmente ou via http.
E, nesse contexto, as regras lingüísticas podem levá-lo até o seguinte:
E eu gosto disso.
Embora, por outro lado - seja seu diretório, você pode chamá-lo de "um recurso ou vários recursos", se é isso que você deseja. Isso não é realmente o importante.
O importante é que, se você colocar um arquivo chamado "123" em um diretório chamado "resourceS" (resultando em
/resourceS/123
), não poderá esperar que ele seja acessível via/resource/123
.Não tente torná-lo mais inteligente do que deveria ser - mudar de plural para singluar, dependendo da quantidade de recursos que você está acessando no momento, pode ser esteticamente agradável para alguns, mas não é eficaz e não faz sentido em um hierárquico sistema .
Nota: Tecnicamente, você pode criar "links simbólicos", para que
/resources/123
também possam ser acessados via/resource/123
, mas o primeiro ainda precisa existir!fonte
Dê uma olhada no Google 's Guia de Design do API: Nomes de Recursos para outra tomada sobre os recursos de nomeação.
Em resumo:
Vale a pena ler se você está pensando sobre esse assunto.
fonte
Usar o plural para todos os métodos é mais prático, pelo menos em um aspecto: se você estiver desenvolvendo e testando uma API de recurso usando o Postman (ou ferramenta similar), não precisará editar o URI ao alternar de GET para PUT para POST etc. .
fonte
Ambas as representações são úteis. Eu tinha usado o singular por conveniência há algum tempo, a inflexão pode ser difícil. Minha experiência no desenvolvimento de APIs REST estritamente singulares, os desenvolvedores que consomem o endpoint não têm certeza de qual seja a forma do resultado. Agora, prefiro usar o termo que melhor descreve a forma da resposta.
Se todos os seus recursos forem de nível superior, você poderá obter representações singulares. Evitar a inflexão é uma grande vitória.
Se você está fazendo algum tipo de link direto para representar consultas sobre relações, os desenvolvedores que escrevem na sua API podem ser auxiliados por uma convenção mais rígida.
Minha convenção é que cada nível de profundidade em um URI está descrevendo uma interação com o recurso pai, e o URI completo deve descrever implicitamente o que está sendo recuperado.
Suponha que tenhamos o seguinte modelo.
Se eu precisasse fornecer um recurso que permita que um cliente obtenha o gerente de um amigo em particular de um usuário em particular, pode parecer algo como:
GET /users/{id}/friends/{friendId}/manager
A seguir, apresentamos mais alguns exemplos:
GET /users
- liste os recursos do usuário na coleção de usuários globaisPOST /users
- crie um novo usuário na coleção de usuários globaisGET /users/{id}
- recuperar um usuário específico da coleção de usuários globaisGET /users/{id}/manager
- obtenha o gerente de um usuário específicoGET /users/{id}/friends
- obtenha a lista de amigos de um usuárioGET /users/{id}/friends/{friendId}
- obtenha um amigo específico de um usuárioLINK /users/{id}/friends
- adicione uma associação de amigos a este usuárioUNLINK /users/{id}/friends
- remover uma associação de amigos deste usuárioObserve como cada nível é mapeado para um pai que pode agir. Usar pais diferentes para o mesmo objeto é contra-intuitivo. A recuperação de um recurso em
GET /resource/123
não deixa indicação de que a criação de um novo recurso deve ser feita emPOST /resources
fonte
Eu sei que a maioria das pessoas está entre decidir entre usar o plural ou o singular. O problema que não foi abordado aqui é que o cliente precisará saber qual você está usando e é sempre provável que cometa um erro. É daí que vem minha sugestão.
E os dois? E com isso, quero dizer usar singular para toda a API e criar rotas para encaminhar solicitações feitas no plural para o singular. Por exemplo:
Você entendeu a foto. Ninguém está errado, com um esforço mínimo, e o cliente sempre acertará.
fonte
/resources
e sempre é redirecionado/resource
, você fez errado. Se outra pessoa usa sua API, ela pode usar o URL correto diretamente ou ser redirecionada (o que funciona, mas está errado) e foi você quem abriu o caminho errado.Não gosto de ver a
{id}
parte dos URLs se sobrepor aos sub-recursos, pois,id
teoricamente, isso poderia ser qualquer coisa e haveria ambiguidade. Está misturando diferentes conceitos (identificadores e nomes de sub-recursos).Problemas semelhantes são freqüentemente vistas em
enum
constantes ou pasta estruturas, onde diferentes conceitos são misturados (por exemplo, quando você tem pastasTigers
,Lions
eCheetahs
, em seguida, também uma pasta chamadaAnimals
no mesmo nível - isso não faz sentido como um é um subconjunto do de outros).Em geral, acho que a última parte nomeada de um endpoint deve ser singular se lida com uma única entidade de cada vez e plural se lida com uma lista de entidades.
Portanto, terminais que lidam com um único usuário:
Depois, há um recurso separado para fazer consultas aos usuários, que geralmente retornam uma lista:
E aqui estão alguns exemplos de um sub-recurso que lida com um usuário específico:
Faça um amigo (link muitos para muitos):
Nunca há ambiguidade, e a nomeação plural ou singular do recurso é uma dica para o usuário o que ele pode esperar (lista ou objeto). Não há restrições sobre
id
s, teoricamente tornando possível ter um usuário com o IDnew
sem sobrepor-se a um nome de sub-recurso (potencial futuro).fonte
Use o Singular e aproveite a convenção em inglês vista em, por exemplo, "Business Directory".
Muitas coisas são lidas desta maneira: "estante de livros", "matilha de cães", "galeria de arte", "festival de cinema", "estacionamento de carros" etc.
Isso corresponde convenientemente ao caminho da URL da esquerda para a direita. Tipo de item à esquerda. Defina o tipo à direita.
Será que
GET /users
realmente sempre buscar um conjunto de usuários? Normalmente não. Ele busca um conjunto de stubs contendo uma chave e talvez um nome de usuário. Portanto, não é realmente/users
assim mesmo. É um índice de usuários, ou um "índice de usuário", se você preferir. Por que não chamar assim? É um/user/index
. Como nomeamos o tipo de conjunto, podemos ter vários tipos mostrando diferentes projeções de um usuário sem recorrer a parâmetros de consulta, por exemplo,user/phone-list
ou/user/mailing-list
.E o Usuário 300? Ainda está
/user/300
.No fechamento, o HTTP pode ter apenas uma única resposta para uma única solicitação. Um caminho está sempre se referindo a algo singular.
fonte
Para mim, os plurais manipulam a coleção , enquanto os singulares manipulam o item dentro dessa coleção.
A coleção permite os métodos GET / POST / DELETE
O item permite os métodos GET / PUT / DELETE
Por exemplo
O POST em / alunos adicionará um novo aluno à escola.
DELETE ativado / alunos removerá todos os alunos da escola.
DELETE em / student / 123 removerá o aluno 123 da escola.
Pode parecer sem importância, mas alguns engenheiros às vezes esquecem o id. Se a rota sempre foi plural e executou um DELETE, você pode acidentalmente limpar seus dados. Enquanto a falta do ID no singular retornará uma rota 404 não encontrada.
Para expandir ainda mais o exemplo, se a API deveria expor várias escolas, algo como
DELETE em / school / abc / students removerá todos os alunos da escola
abc
.Escolher a palavra certa às vezes é um desafio por si só, mas eu gosto de manter a pluralidade da coleção. Por exemplo,
cart_items
oucart/items
parece certo. Ao contráriocart
, a exclusão exclui o objeto do carrinho e não os itens do carrinho;).fonte
E se:
/resource/
(não/resource
)/resource/
significa que uma pasta contém algo chamado "recurso", é uma pasta "recurso".E também acho que a convenção de nomenclatura das tabelas de banco de dados é a mesma, por exemplo, uma tabela chamada 'user' é uma "tabela de usuário", contém algo chamado "usuário".
fonte
Prefiro usar o plural (
/resources
) e o singular (/resource/{id}
) porque acho que separa mais claramente a lógica entre trabalhar na coleção de recursos e trabalhar em um único recurso.Como um efeito colateral importante disso, também pode ajudar a impedir que alguém use a API incorretamente. Por exemplo, considere o caso em que um usuário tenta obter um recurso incorretamente, especificando o ID como um parâmetro como este:
Nesse caso, onde usamos a versão plural, o servidor provavelmente ignorará o parâmetro Id e retornará a lista de todos os recursos. Se o usuário não for cuidadoso, ele pensará que a chamada foi bem-sucedida e usará o primeiro recurso da lista.
Por outro lado, ao usar a forma singular:
o servidor provavelmente retornará um erro porque o ID não está especificado da maneira correta e o usuário terá que perceber que algo está errado.
fonte