Usando o HTTP Faixa de cabeçalho com um especificador de gama diferente de bytes?
-
07-07-2019 - |
Pergunta
A questão central é sobre o uso do cabeçalhos HTTP, incluindo Gama , Se-Range , Accept-Ranges e uma gama definida pelo usuário especificador.
Aqui está um exemplo fabricados para ajudar a ilustrar a minha pergunta. Suponha que eu tenho um aplicativo de estilo Web 2.0 que apresenta algum tipo de documentos legíveis. Estes documentos são editorialmente divididos em páginas (semelhantes a artigos que você vê em sites de notícias). Para este exemplo, suponha:
- Existe um documento intitulado "HTTP Faixa Pergunta" é dividido em três páginas.
- A página shell (
/document/shell/http-range-question
) conhece a meta informações sobre o documento, incluindo o número de páginas. - A primeira página legível do documento é carregado durante o evento página onload através de um GET ajax e inserido na página.
- controle de uma interface de usuário que se parece com [1 2 3 All] é na parte inferior da página, e clicar em um número irá exibir essa página legível (também carregado via ajax), e clicar em " All" irá mostrar todo o documento. Assumir essas URLs para os 1, 2, 3 e todos usam casos:
-
/document/content/http-range-question?page=1
-
/document/content/http-range-question?page=2
-
/document/content/http-range-question?page=3
-
/document/content/http-range-question
-
Agora, para a questão. Posso usar os cabeçalhos HTTP Faixa vez parte do URL (por exemplo, uma querystring parâmetro)? Talvez algo como isso no pedido GET /document/content/http-range-question
:
Range: page=1
Parece que a especificação só define intervalos de bytes como permitido, por isso mesmo que eu fiz minhas chamadas de ajax trabalhar com o meu navegador e código do servidor, qualquer coisa no meio poderia romper o contrato (por exemplo, um cache de servidor proxy).
Range: bytes=0-499
Todas as opiniões ou exemplos do mundo real de especificadores intervalo personalizado?
Atualizar : Eu encontrei uma pergunta semelhante sobre o cabeçalho Range ( paginação em um descanso Coleção ), onde eles mencionam que o Dojo JsonRestStore usos um costume Faixa valor de cabeçalho.
Range: items=0-24
Solução
Absolutamente - você está livre para especificar quaisquer unidades alcance você gosta ??p>.
A partir RFC 2616:
3,12 Faixa Unidades
HTTP / 1.1 permite que um cliente pedido que apenas uma parte (a faixa de) o
entidade resposta ser incluídos no resposta. HTTP / 1.1 usos variam unidades no Range (seção 14.35) e Content-Range (seção 14.16)
campos de cabeçalho. Uma entidade pode ser quebrado para baixo em subintervalos de acordo com a várias unidades estruturais.range-unit = bytes-unit | other-range-unit bytes-unit = "bytes" other-range-unit = token
A única unidade de gama definida por HTTP / 1.1 é "bytes". HTTP / 1.1
implementações podem ignorar gamas especificados utilizando outras unidades.
A peça-chave é o último parágrafo. Realmente o que ele está dizendo é que, quando eles escreveram a especificação de HTTP / 1.1, eles só delineou o "bytes" token. Mas, como você pode ver a partir do bit 'outro-range-unit', você está livre para chegar a seus próprios especificadores de tokens.
Chegando-se com seus próprios especificadores Faixa significa que você tem que ter controle sobre o código de cliente e servidor que usa esse especificador. Então, se você possui a peça backend que expõe o "/ document / content / http-range-pergunta" URI, você é bom para ir; presumivelmente você estiver usando um framework web moderna que permite inspecionar os cabeçalhos de solicitação entrando. Você poderia, então, olhar para os valores variam para executar a consulta apoio corretamente.
Além disso, se você controlar o código AJAX que faz pedidos para o servidor, você deve ser capaz de definir o cabeçalho de intervalo si mesmo.
No entanto, há uma desvantagem potencial que você antecipar na sua pergunta: o potencial de caching pausa. Se você estiver usando uma unidade de intervalo personalizado, quaisquer caches entre o cliente e os servidores de origem "pode ??ignorar intervalos especificados usando [diferentes de 'bytes' unidades]". Assim, por exemplo, se você tivesse um cache Squid / Varnish entre a frente e back-end, não há nenhuma garantia de que os resultados que você está esperando será servido a partir do cache!
Você também pode considerar uma implementação alternativa, onde, ao invés de usar uma seqüência de consulta, você tornar a página um "parâmetro" da URI; g .: / document / content / http-range-pergunta / page / 1. Este seria provavelmente um pouco mais de trabalho para você do lado do servidor, mas é HTTP / 1.1 e caches deve tratá-lo adequadamente.
Espero que isso ajude.
Outras dicas
HTTP é normalmente usado para recuperar downloads interrompidos sem começar desde o início.
O que você está tentando fazer seriam melhor tratadas por OAI-ORE , que permite -lo a definir relações entre vários documentos. (Formatos alternativos, os componentes do conjunto, etc)
Infelizmente, é um relativamente novo formato de metadados, e eu não sei de qualquer navegador web que navio com suporte nativo.
bytes é a única unidade suportada por HTTP 1.1 Especificação.
Parece que você deseja alterar a especificação HTTP apenas para remover um parâmetro querystring. A fim de fazer isso você teria que modificar o código no cliente para enviar o cabeçalho modificado e o servidor para ler o cabeçalho "Range", em vez da querystring.
O resultado final é que isso irá provavelmente trabalho, mas você está quebrando todos os padrões e ferramentas existentes para fazê-lo.