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
Foi útil?

Solução

Absolutamente - você está livre para especificar quaisquer unidades alcance você gosta .

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

Faixa

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top