Pergunta interessante.
Basicamente, podemos reduzir isso para o caminho certo para classificar as coisas em termos análogos às camadas OSI. O HTTP é comumente definido como um protocolo de nível de aplicativo, e o HTTP é de fato um protocolo genérico de cliente / servidor.
No entanto, na prática, o servidor é quase sempre um dispositivo de retransmissão, e o cliente é um navegador da Web, responsável por interpretar e renderizar conteúdo: o servidor apenas passa as informações para um aplicativo arbitrário e esses aplicativos enviam de volta scripts arbitrários qual o navegador é responsável pela execução. A interação HTTP em si - os formulários de solicitação / resposta, os códigos de status e assim por diante - é principalmente uma questão de como solicitar, exibir e renderizar conteúdo arbitrário da maneira mais eficiente possível, sem atrapalhar. Muitos dos códigos de status e cabeçalhos são realmente projetados para esses propósitos.
O problema de tentar utilizar o protocolo HTTP para lidar com fluxos específicos de aplicativos é que você tem uma de duas opções: 1) Você deve tornar sua lógica de solicitação / resposta um subconjunto das regras HTTP; ou 2) Você deve reutilizar certas regras e, em seguida, a separação de interesses tende a ficar confusa. Isso pode parecer bom e limpo no começo, mas acho que é uma daquelas decisões de design que você acaba lamentando à medida que seu projeto evolui.
Portanto, eu diria que é melhor ser explícito sobre a separação de protocolos. Deixe o servidor HTTP e o navegador da Web fazerem as suas próprias coisas, e deixe o aplicativo fazer o próprio seu . O aplicativo precisa ser capaz de fazer solicitações e precisa das respostas - e sua lógica de como solicitar, como interpretar as respostas, pode ser mais (ou menos) complexa do que a perspectiva HTTP.
O outro benefício dessa abordagem, que vale a pena mencionar, é que os aplicativos, em geral, não devem depender de um protocolo de transporte subjacente (do ponto de vista lógico). O próprio HTTP foi alterado no passado e agora temos o HTTP 2 funcionando, seguindo o SPDY. Se você visualizar seu aplicativo como não mais do que um plug-in de funcionalidade HTTP, poderá ficar preso quando novas infraestruturas forem implementadas.