Estamos lançando uma nova API REST e eu queria algumas sugestões da comunidade sobre práticas recomendadas sobre como deveríamos ter os parâmetros de entrada formatados:
No momento, nossa API é muito centrada em JSON (retorna apenas JSON). O debate sobre se queremos / precisamos retornar XML é uma questão separada.
Como nossa saída de API é centrada em JSON, seguimos um caminho em que nossas entradas são um pouco centradas em JSON e eu estive pensando que pode ser conveniente para alguns, mas estranho em geral.
Por exemplo, para obter alguns detalhes do produto em que vários produtos podem ser extraídos de uma só vez, atualmente temos:
http://our.api.com/Product?id=["101404","7267261"]
Devemos simplificar isso como:
http://our.api.com/Product?id=101404,7267261
Ou a entrada JSON é útil? Mais dor?
Podemos aceitar os dois estilos, mas essa flexibilidade realmente causa mais confusão e dores de cabeça (manutenção, documentação etc.)?
Um caso mais complexo é quando queremos oferecer contribuições mais complexas. Por exemplo, se queremos permitir vários filtros na pesquisa:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Não queremos necessariamente colocar os tipos de filtro (por exemplo, productType e color) como nomes de solicitação como este:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Porque queríamos agrupar todas as entradas de filtro.
No final, isso realmente importa? Pode ser que haja tantos utilitários JSON por aí que o tipo de entrada simplesmente não importe muito.
Sei que nossos clientes JavaScript que fazem chamadas AJAX para a API podem apreciar as entradas JSON para facilitar sua vida.
[]
sintaxe nem sempre é suportada (e, apesar de comum, pode até violar a especificação do URI). Alguns servidores HTTP e linguagens de programação preferem apenas repetir o nome (por exemploproductType=value1&productType=value2
)./user/
e no corpo, eu vou enviar{ q:{}, d: {} }
comq
a consulta com o usuário será consultado no banco de dados ed
como os dados modificados.A maneira padrão de passar uma lista de valores como parâmetros de URL é repeti-los:
http://our.api.com/Product?id=101404&id=7267261
A maioria dos códigos de servidor interpretará isso como uma lista de valores, embora muitos tenham simplificações de valor único, portanto você pode precisar procurar.
Valores delimitados também estão bem.
Se você precisar enviar JSON para o servidor, não gosto de vê-lo na URL (que é um formato diferente). Em particular, os URLs têm uma limitação de tamanho (na prática, se não na teoria).
A maneira como eu vi alguns fazerem uma consulta complicada RESTfully é em duas etapas:
POST
seus requisitos de consulta, recebendo de volta um ID (essencialmente criando um recurso de critério de pesquisa)GET
a pesquisa, referenciando o ID acimafonte
Primeiro:
Eu acho que você pode fazer isso de duas maneiras
http://our.api.com/Product/<id>
: se você quer apenas um registrohttp://our.api.com/Product
: se você quiser todos os registroshttp://our.api.com/Product/<id1>,<id2>
: como James sugeriu, pode ser uma opção, pois o que vem depois da tag Product é um parâmetroOu o que eu mais gosto é:
Você pode usar a propriedade Hipermídia como o mecanismo do estado do aplicativo (HATEOAS) de um RestFul WS e fazer uma chamada
http://our.api.com/Product
que deve retornar os URLs equivalenteshttp://our.api.com/Product/<id>
e chamá-los depois disso.Segundo
Quando você precisar fazer consultas nas chamadas de URL. Eu sugeriria o uso do HATEOAS novamente.
1) Faça uma chamada para
http://our.api.com/term/pumas/productType/clothing/color/black
2) Faça uma chamada para
http://our.api.com/term/pumas/productType/clothing,bags/color/black,red
3) (Usando HATEOAS) Faça uma chamada para ` http://our.api.com/term/pumas/productType/ -> receba os URLs com todas as roupas possíveis -> ligue para os que você deseja (roupas e bolsas) - > receba os possíveis URLs de cores -> ligue para os que você deseja
fonte
Você pode querer conferir o RFC 6570 . Esta especificação de modelo de URI mostra muitos exemplos de como os URLs podem conter parâmetros.
fonte
Primeiro caso:
Uma pesquisa normal de produto seria assim
http://our.api.com/product/1
Então, eu estou pensando que a melhor prática seria para você fazer isso
http://our.api.com/Product/101404,7267261
Segundo caso
Pesquise com parâmetros de string de consulta - bem assim. Eu ficaria tentado a combinar termos com AND e OR em vez de usar
[]
.PS Isso pode ser subjetivo, faça o que você se sentir confortável.
O motivo para colocar os dados no URL é para que o link possa ser colado em um site / compartilhado entre usuários. Se isso não for um problema, use um JSON / POST.
EDIT: Na reflexão, acho que essa abordagem combina com uma entidade com uma chave composta, mas não com uma consulta para várias entidades.
fonte
/
não deve estar lá, pois o URI endereça um recurso, não uma coleção.Apoiarei a resposta da nategood, pois ela está completa e parecia ter agradado às suas necessidades. No entanto, gostaria de adicionar um comentário sobre a identificação de vários (1 ou mais) recursos dessa maneira:
http://our.api.com/Product/101404,7267261
Ao fazer isso, você:
Complexifique os clientes , forçando-os a interpretar sua resposta como uma matriz, o que para mim é contra-intuitivo se eu fizer a seguinte solicitação:
http://our.api.com/Product/101404
Crie APIs redundantes com uma API para obter todos os produtos e a acima para obter 1 ou mais. Como você não deve mostrar mais de uma página de detalhes para um usuário em benefício do UX, acredito que ter mais de um ID seria inútil e puramente usado para filtrar os produtos.
Pode não ser tão problemático, mas você precisará lidar com isso do lado do servidor retornando uma única entidade (verificando se sua resposta contém uma ou mais) ou permitir que os clientes gerenciem.
Exemplo
Quero encomendar um livro da Amazing . Sei exatamente qual é o livro e o vejo na lista ao navegar pelos livros de Terror:
Depois de selecionar o segundo livro, sou redirecionado para uma página que detalha a parte do livro de uma lista:
Ou em uma página que me fornece apenas os detalhes completos desse livro?
Minha opinião
Eu sugeriria o uso da identificação na variável path quando a unicidade é garantida ao obter os detalhes desse recurso. Por exemplo, as APIs abaixo sugerem várias maneiras de obter os detalhes de um recurso específico (supondo que um produto tenha um ID exclusivo e uma especificação para esse produto tenha um nome exclusivo e você possa navegar de cima para baixo):
No momento em que você precisar de mais de um recurso, sugiro filtrar a partir de uma coleção maior. Para o mesmo exemplo:
Obviamente, esta é a minha opinião, pois não é imposta.
fonte