Os leitores novos deste tópico ficarão impressionados com a interminável discussão sobre o que você deve fazer e a relativa ausência de lições da experiência. O fato de o REST ser "preferido" em relação ao SOAP é, suponho, um aprendizado de alto nível com a experiência, mas, por Deus, devemos ter progredido a partir daí? É 2016. A dissertação de Roy foi em 2000. O que desenvolvemos? Foi divertido? Foi fácil integrar? Suportar? Ele suportará o surgimento de smartphones e conexões móveis esquisitas?
Segundo ME, as redes da vida real não são confiáveis. Solicita tempo limite. As conexões são redefinidas. As redes ficam inoperantes por horas ou dias por vez. Os trens entram em túneis com usuários móveis a bordo. Para qualquer solicitação (como ocasionalmente reconhecido em toda essa discussão), a solicitação pode cair na água a caminho ou a resposta pode cair na água no caminho de volta. Nessas condições, emitir solicitações PUT, POST e DELETE diretamente contra recursos substantivos sempre me pareceu um pouco brutal e ingênuo.
O HTTP não faz nada para garantir a conclusão confiável da solicitação-resposta, e isso é ótimo porque esse é o trabalho dos aplicativos que reconhecem a rede. Ao desenvolver esse aplicativo, você pode percorrer os aros para usar PUT em vez do POST e, em seguida, mais aros para dar um certo tipo de erro no servidor se detectar solicitações duplicadas. De volta ao cliente, você precisa pular etapas para interpretar esses erros, buscar novamente, revalidar e republicar.
Ou você pode fazer o seguinte : considere suas solicitações inseguras como recursos efêmeros para um único usuário (vamos chamá-los de ações). Os clientes solicitam uma nova "ação" em um recurso substantivo com um POST vazio para o recurso. O POST será usado apenas para isso. Uma vez em posse do URI da ação recém-criada com segurança, o cliente coloca a solicitação insegura no URI da ação, não no recurso de destino . Resolver a ação e atualizar o recurso "real" é o trabalho da sua API e é aqui dissociado da rede não confiável.
O servidor faz o negócio, retorna a resposta e a armazena na URI de ação acordada . Se algo der errado, o cliente repetirá a solicitação (comportamento natural!) E, se o servidor já a tiver visto, repetirá a resposta armazenada e não fará mais nada .
Você identificará rapidamente a semelhança com as promessas: criamos e devolvemos o espaço reservado para o resultado antes de fazer qualquer coisa. Também como uma promessa, uma ação pode ter sucesso ou falhar uma vez, mas seu resultado pode ser buscado repetidamente.
O melhor de tudo é que damos aos aplicativos de envio e recebimento a chance de vincular a ação identificada exclusivamente à exclusividade em seus respectivos ambientes. E podemos começar a exigir e impor !, comportamento responsável dos clientes: repita suas solicitações o quanto quiser, mas não gere uma nova ação até que você possua um resultado definitivo da existente.
Como tal, numerosos problemas espinhosos desaparecem. Solicitações de inserção repetidas não criarão duplicatas e não criaremos o recurso real até que possuamos os dados. (as colunas do banco de dados podem permanecer não anuláveis). Solicitações de atualização repetidas não atingem estados incompatíveis e não substituem as alterações subseqüentes. Os clientes podem (re) buscar e processar sem problemas a confirmação original por qualquer motivo (falha do cliente, falta de resposta etc.).
Solicitações de exclusão sucessivas podem ver e processar a confirmação original, sem ocorrer um erro 404. Se as coisas demorarem mais do que o esperado, podemos responder provisoriamente e temos um local onde o cliente pode verificar novamente o resultado definitivo. A parte mais legal desse padrão é sua propriedade Kung-Fu (Panda). Tomamos uma fraqueza, a propensão para os clientes repetirem uma solicitação sempre que não entenderem a resposta e a transformarem em uma força :-)
Antes de me dizer que isso não é RESTful, considere as inúmeras maneiras pelas quais os princípios REST são respeitados. Os clientes não constroem URLs. A API permanece detectável, embora com uma pequena alteração na semântica. Os verbos HTTP são usados adequadamente. Se você acha que essa é uma grande mudança para implementar, posso dizer por experiência que não é.
Se você acha que terá enormes quantidades de dados para armazenar, vamos falar sobre volumes: uma confirmação típica de atualização é uma fração de um kilobyte. Atualmente, o HTTP oferece um ou dois minutos para responder definitivamente. Mesmo que você armazene ações apenas por uma semana, os clientes terão muitas chances de alcançá-los. Se você tiver volumes muito altos, convém um armazenamento de valores-chave dedicado compatível com ácido ou uma solução na memória.