Estou trabalhando no projeto de uma API RESTful. Sabemos que queremos retornar JSON e XML para qualquer recurso. Eu estava pensando que faríamos algo assim:
GET /api/something?param1=value1
Accept: application/xml (or application/json)
No entanto, alguém jogou fora usando extensões para isso, assim:
GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)
Quais são as vantagens e desvantagens dessas abordagens? É melhor confiar no cabeçalho de aceitação quando uma extensão não é especificada, mas respeitar extensões quando especificado? Existe uma desvantagem nessa abordagem?
architecture
web-services
rest
http
Brandon Linton
fonte
fonte
Respostas:
Isso, "No entanto, filosoficamente - a primeira abordagem é a única abordagem.", E este "O método RESTful oficial adequado é usar o cabeçalho Accept:". são amplamente percebidos como o caso, mas também são absolutamente incorretos .
Aqui está um breve trecho de Roy Fielding (que definiu REST) ...
"a seção 6.2.1 não diz que a negociação de conteúdo deve ser usada o tempo todo." citar
Essa conversa em particular está no contexto do cabeçalho 'Accept-Language:', mas o mesmo se aplica igualmente ao cabeçalho 'Accept:', como ficou claro posteriormente em sua resposta ...
"Não faço ideia por que as pessoas não conseguem ver o segundo e o terceiro link na página superior
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
apontam para as duas edições em PDF ".
O que ele quer dizer com isso é que não há problema em usar pontos de extremidade diferentes para diferentes representações dos mesmos dados de origem. (Nesse caso, um ponto final .html e dois pontos finais .pdf diferentes.)
Também em uma discussão semelhante, desta vez sobre as virtudes do uso de parâmetros de consulta versus o uso de extensões de arquivo para diferentes tipos de mídia ...
"É por isso que eu sempre prefiro extensões. Nenhuma das opções tem algo a ver com o REST." citar
Novamente, isso é um pouco diferente das extensões Accept vs. filename, mas a posição de Fielding ainda é clara.
Resposta - isso realmente não importa muito. As trocas entre os dois não são muito significativas e ambos são estilos aceitáveis.
fonte
A abordagem RESTful oficial adequada é usar o
Accept:
cabeçalho.No entanto, você deve ter cuidado para não quebrar a capacidade de cache, que é um dos requisitos do REST. Você precisa ter um
Vary: Accept
cabeçalho e um cache que o entendam. No mundo ideal, você teria, mas na vida real sua milhagem pode variar. Portanto, a segunda solução não é tão limpa, mas pode ser mais prática.Além disso, observe que alguns navegadores muito antigos costumavam ignorar cabeçalhos, dependendo da extensão.
fonte
Tecnicamente, isso realmente não importa - seu servidor da Web poderá passar pelo processo de maneira apropriada. (Estou assumindo isso, mas não parece um showstopper).
No entanto, filosoficamente - a primeira abordagem é a única abordagem. No REST, na verdade, o URL apenas aponta para um URI - que é apenas um recurso. Pense por um momento esse recurso, igual ao objeto na programação orientada a objetos. Você fala com esse recurso através de apenas 4 métodos (também conhecidos como GET / POST / PUT / DELETE - ou se algo que o transporte permitir), mas esse método não se torna descrição do objeto. Da mesma forma, os aspectos em que o valor retornado não é o URI. O objeto ainda é algo e não algo.xml ou algo.json
Suponha que, se você não quiser usar o cabeçalho Accept, mas se ainda quiser ser verdadeiramente REST filosoficamente, não me importo com algo como:
em oposição a
Mas como eu disse, essa diferença é apenas filosófica.
fonte
@artec: Eu acho que você está errado
O princípio RESTful oficial apropriado diz que nada deve ser oculto nos cabeçalhos HTTP, pois é o URI que é exposto ou referenciado; qualquer detalhe sobre a solicitação / resposta deve ser fornecido como parte do URI
Por isso, recomendo fortemente evitar o uso do cabeçalho para obter detalhes sobre a solicitação e resposta e manter
Não consigo encontrar as referências rapidamente, mas vou postá-las de volta com elas (na verdade, você pode consultar o livro de publicação O'reilly "RESTful web services" ( http://shop.oreilly.com/product/9780596529260.do ) o que confirma o mesmo
fonte