Com um serviço RESTful, você pode criar, ler, atualizar e excluir recursos. Tudo isso funciona bem quando você está lidando com algo como ativos de banco de dados - mas como isso se traduz em dados de streaming? (Ou não?) Por exemplo, no caso do vídeo, parece bobo tratar cada quadro como um recurso que devo consultar um de cada vez. Em vez disso, eu configuraria uma conexão de soquete e transmitiria uma série de quadros. Mas isso quebra o paradigma RESTful? E se eu quiser retroceder ou avançar o stream? Isso é possível dentro do paradigma RESTful? Então: Como os recursos de streaming se encaixam no paradigma RESTful?
Por uma questão de implementação, estou me preparando para criar esse serviço de streaming de dados e quero ter certeza de que estou fazendo isso da "melhor maneira". Tenho certeza de que esse problema já foi resolvido antes. Alguém pode me indicar um bom material?
Respostas:
Não consegui encontrar materiais sobre streaming verdadeiramente RESTful - parece que os resultados são principalmente sobre delegar streaming a outro serviço (o que não é uma solução ruim). Portanto, farei o meu melhor para resolver isso sozinho - observe que streaming não é meu domínio, mas tentarei adicionar meus 2 centavos.
No aspecto de streaming, acho que precisamos separar o problema em duas partes independentes:
1.) Acesso aos recursos de mídia
Isso é bastante direto e pode ser tratado de uma forma limpa e com REST. Como exemplo, digamos que teremos uma API baseada em XML que nos permite acessar uma lista de fluxos:
... e também para fluxos individuais:
2.) Acesso ao próprio meio / fluxo
Esta é a parte mais problemática. Você já apontou uma opção em sua pergunta, que é permitir o acesso aos frames individualmente por meio de uma API RESTful. Mesmo que isso funcione, concordo com você que não é uma opção viável.
Eu acho que há uma escolha a ser feita entre:
Acredito que o primeiro seja a escolha mais eficiente, embora requeira um serviço de streaming dedicado (e / ou hardware). Pode ser um pouco no limite do que é considerado RESTful, no entanto, observe que nossa API é RESTful em todos os aspectos e mesmo que o serviço de streaming dedicado não adira à interface uniforme (GET / POST / PUT / DELETE), nossa API faz. Nossa API nos permite o controle adequado sobre os recursos e seus metadados via GET / POST / PUT / DELETE, e fornecemos links para o serviço de streaming (aderindo assim ao aspecto de conexão do REST).
A última opção - streaming via HTTP - pode não ser tão eficiente quanto a anterior, mas é definitivamente possível. Tecnicamente, não é muito diferente de permitir o acesso a qualquer forma de conteúdo binário via HTTP. Nesse caso, nossa API forneceria um link para o recurso binário acessível via HTTP e também nos informa sobre o tamanho do recurso:
O cliente pode acessar o recurso via HTTP usando
GET /media/1.3gp
. Uma opção é o cliente baixar todo o recurso - download progressivo HTTP . Uma alternativa mais limpa seria o cliente acessar o recurso em partes usando cabeçalhos de intervalo HTTP . Para buscar o segundo fragmento de 256 KB de um arquivo de 1 MB, a solicitação do cliente ficaria assim:Um servidor que oferece suporte a intervalos responderia com o cabeçalho Content-Range , seguido pela representação parcial do recurso:
Observe que nossa API já informa ao cliente o tamanho exato do arquivo em bytes (1 MB). No caso de o cliente não saber o tamanho do recurso, ele deve primeiro chamar
HEAD /media/1.3gp
para determinar o tamanho, caso contrário, estará arriscando uma resposta do servidor com416 Requested Range Not Satisfiable
.fonte