Usando a validação HTTP

A melhor abordagem é usar o modelo de validação de HTTP. Este modelo envia a cada resposta com uma passagem que faz referência a singularidade dos dados. Se o cliente deseja transferir o conteúdo novamente, o cliente envia ao servidor um bilhete da última transferência. O servidor compara o bilhete enviado com o bilhete que ele tem, e se o servidor de avisos dos bilhetes são idênticos, ele envia um HTTP 304 para indicar que não houve mudanças. Nesse ponto, o cliente pode recuperar o conteúdo antigo do cache e apresentá-lo para o usuário como a última e maior. O modelo de validação de HTTP requer ainda uma solicitação HTTP, mas não inclui o custo de gerar e enviar novamente o conteúdo. Em termos de uma conversa HTTP, o modelo de validação de HTTP é implementado como se segue. Este exemplo ilustra um pedido de um cliente e a resposta do servidor.

 Pedido 1GET / ajax/chap04/cachedpage.html HTTP/1.1 Accept: * / * Accept-Language: pt-br Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0, Windows NT 5.1 SV1; . NET CLR 2.0.50215) Host: 127.0.0.1:8081 Connection: Keep-Alive Resposta 1HTTP/1.1 ETag 200 OK: W / "45-1123668584000" Last-Modified: Wed, 10 Aug 2005 10:09:44 GMT Content-Type: text / html Content-Length: 45 Data: Qua, 10 Ago 2005 10: 11:54 GMT Server: Apache-Coyote/1.1  Conteúdo em cache 
  

O cliente faz uma solicitação para o documento / ajax/chap04/cachedpage.html. O servidor responde com o conteúdo, mas não há controle de cache ou identificador Expira. Isto parece indicar que o conteúdo retornado não está em cache, mas isso não é verdade. O servidor tem indicado que está usando o modelo de validação de HTTP, e não o modelo de expiração HTTP. A página que é retornada tornou-se parte de um cache identificado pelo identificador ETag único. O identificador ETag, chamado um tag entidade, Poderia ser comparado a um código hash exclusivo para uma página HTML. A letra W que é prefixado ao identificador tag entidade significa que a página é uma referência fraca eo servidor HTTP pode não reflectir imediatamente atualiza a página no lado do servidor. O próximo passo é atualizar o browser e pedir para a mesma página novamente. A conversa HTTP é a seguinte.

 Pedido 2GET / ajax/chap04/cachedpage.html HTTP/1.1 Accept: * / * Accept-Language: pt-br Accept-Encoding: gzip, deflate If-Modified-Since: Wed, 10 Aug 2005 10:09:44 GMT Se - None-Match: W / "45-1123668584000" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0, Windows NT 5.1 SV1;. NET CLR 2.0.50215) Host: 192.168.1.100:8081 Connection: Keep-Alive Resposta 2HTTP/1.1 304 Not Modified Date: Wed, 10 Aug 2005 10:11:58 GMT Server: Apache-Coyote/1.1

Quando o cliente faz o segundo pedido, os identificadores adicionais If-Modified-Since e If-None-Match são enviados no pedido. Observe como o If-None-Match referências identificador, o identificador do valor anteriormente enviados ETag. O servidor consulta a URL e gera uma tag entidade. Se a marca entidade é idêntico ao valor a ser enviada, o servidor retorna um HTTP 304 código para indicar que o conteúdo não foi alterado. Quando utilizar etiquetas entidade, o cliente pode enviar um If-Match ou um If-None-Match. Se o cliente envia um If-Match, e os dados sobre o servidor está fora da data, o servidor retorna um erro de cache miss, e não os novos dados. Se o cliente envia um If-None-Match identificador quando os dados do servidor não é alterado, o servidor envia um código de retorno HTTP 304. Se os dados estiverem fora da data, os novos dados são enviados.

A vantagem de utilizar o modelo de validação de HTTP de cache é que você está sempre garantido para obter a versão mais recente no momento do pedido. Os clientes podem fazer o pedido a cada dois segundos, horas, semanas ou o período que escolher. Cabe ao cliente decidir quando começar uma nova cópia dos dados. Concedido, ainda há o tráfego HTTP, devido aos pedidos, mas foi reduzida para aminimum. Dito isto, há situações quando se utiliza o modelo de expiração HTTP faz sentido, por exemplo, quando o conteúdo HTML é estático e as mudanças raramente . O modelo de expiração HTTP pode ser usado no modelo de pedido único para podar as entradas do controlador de cache quando eles se tornam obsoletos.

Implementação de um cliente HTTP cache usando Validação O cache do cliente único pedido pode ser estendido para usar a validação de HTTP. Que mudanças no modelo de validação de HTTP é que um pedido física sempre será feita. A partir da perspectiva da navegação de metadados, isto pode causar um pequeno atraso devido à necessidade de fazer um pedido para verificar se os dados estão em curso. No entanto, o ciclo de resposta ao pedido é bastante rápida, como a maioria dos casos resultam em um "não mudou" de resposta. A implementação completa das duas funções necessárias para Asynchronous é a seguinte.

 Fonte: / cliente / scripts / Jaxson / var Common.js HttpValidationCacheController = (_cache: new Array () didNotFindETagError: function (url) ()) function HTTPValProcessAndBreakBeforeRequest (xmlhttp, request, settings) (if (request.action == "GET" ) (var obj = HttpValidationCacheController._cache [URL]; if (obj! = null) ( this.xmlhttp.setRequestHeader ( "If-None-Match", obj.ETag); this.xmlhttp.setRequestHeader ( "Pragma", "no-cache"); this.xmlhttp.setRequestHeader ( "Cache-Control", "no-cache");)) Return false;) function HTTPValProcessAndBreakAfterRequest (xmlhttp, request, settings) (if (xmlhttp.status == 200 & & request.action == "GET") (if (xmlhttp.status == 200) (try (var foundetag = xmlhttp.getResponseHeader ( "ETag"); if (foundetag! = null) (HttpValidationCacheController._cache [url] = ( ETag: foundetag,Status: xmlhttp.status, StatusText: xmlhttp.statusText, ResponseText: xmlhttp.responseText, ResponseXML: xmlhttp.responseXML);) else (HttpValidationCacheController.didNotFindETagError url ();)) catch (Exception) (HttpValidationCacheController.didNotFindETagError (url);) ) else if (status == 304) (var obj = HttpValidationCacheController._cache [URL]; if (obj! = null) (var fakeXMLHttp = (status: 200, statusText: obj.StatusText, responseText: obj.ResponseText, responseXML: obj.ResponseXML,) try (settings.onComplete (fakeXMLHttp); return true;) catch (e) (globals.errorHandler (e);)) else (throw new Error ( "Server indicado que essa informação está no cache");))) return false;)

 

Tome um momento para analisar o código. Você verá muitas semelhanças com o único código de cache solicitação do cliente. As maiores diferenças foram destacadas em negrito. A grande diferença no pedido HTTPValProcessAndBreakBeforeRequest é a adição de cabeçalhos HTTP a validação para identificar o ETag para um pedido anteriormente executado. Porque usar validação HTTP significa executar um pedido, HTTPValProcessAndBreakBeforeRequest tem que retornar falso em todas as situações.

A função HTTPValProcessAndBreakAfterRequest é mais complicado porque a sua lógica é mais sofisticado. Se a validação HTTP é utilizado eo servidor suporta validação de HTTP, o servidor pode responder com dois códigos de status HTTP para cada solicitação: 200 e 304. Se o código de estado é de 200, quer os dados foi alterado ou os dados nunca foi alterado.

Independentemente da razão para o código de status de 200, os dados precisam ser adicionados à instância cache HttpValidationCacheController. A única diferença grande no que diz respeito ao cache único pedido do cliente é o adicional de armazenamento da ETag. Se o código de status é 304, então uma instância XMLHttpRequest falso é criado eo método settings.onComplete é chamado, como mostra a única implementação de cache solicitação do cliente. Definir e executar o resto URLs a arquitetura ea implementação do cliente de uma geral " o que fazer "perspectiva é completo. Nós ainda precisamos cobrir os detalhes do URLs e da arquitetura do servidor. Nesse ponto, eu quero mostrar para refrescar sua memória. A separação entre o envio ea recepção de dados é muito importante porque é o que torna possível para um cliente para fazer um pedido hoje e pedir a resposta amanhã. Se a pergunta ea resposta tinha de ser no contexto de um único pedido, o cliente pode ter de esperar por um tempo muito longo.

Para colocar isso em outro contexto, você pode pensar da separação de pedido e resposta como a diferença entre estar na linha de assistência em uma loja e escolher um número de assistência. Imagine fazer compras e comprar alguns especialmente pedaços de madeira serrada. Cada loja de madeira tem a sua própria estratégia de servir seus clientes. Uma das estratégias é fazer com que os clientes até a linha (fila) e esperar sua vez. Mas e se a linha é muito tempo? Você pode ser tentado a entrar na fila? E se você decidir entrar na fila e perceber que você tem que ir ao banheiro, ou você tem que colocar algum dinheiro no parquímetro? No momento em que pisar fora da linha, você perderá sua posição e tem que começar The Game espera desde o início. De uma perspectiva arquitetônica filas são irritantes para o servidor porque o servidor precisa para gerenciar o pedido e manter a atenção da conexão do cliente.

Outra abordagem, e que é justo, é que cada cliente que quer um pedaço de madeira especial escolhe um número e preenche uma ordem. A ordem é submetido a um vendedor, e ele ou ela lhe dirá mais ou menos quando a madeira estará disponível. Durante o tempo de espera, você pode ir ao banheiro, almoçar, ou comprar outras coisas. A ordem simbólica ea abordagem torna possível dissociar o cliente espera da loja para otimizar o tempo necessário para preparar as peças especiais de madeira serrada. Por exemplo, com base em um conjunto de ordens, a loja pode enfileirar os pedidos com base na prioridade, habilidade e complexidade. Essa arquitetura é única porque você usa um HTTP POST para enviar o pedido, e em troca recebe uma indicação de onde o código pode encontrar a resposta. Você não tem que fornecer a indicação, que poderá ser determinada por meio de programação. No caso do pedido de cotação, o local é determinado por meio de programação.

 / pyservices / comerciante / histórico / tickers

Isto representa uma raiz que aceita a URL HTTP GET e POST. Executando um GET retornará uma lista de links para todos os resultados disponíveis. Os resultados podem ser os resultados no sentido puro cálculo ou, no caso do pedido de cotação, um anúncio de tickers sendo vigiado. Obtendo uma lista de todos os resultados disponíveis é inútil quando você não sabe o que significa o anúncio. O pedido de cotação com o seu anúncio é fácil de decifrar, porque cada resultado representa um ticker assistidos. Mas e se a raiz URL representa um cálculo? O anúncio potencial dos resultados URLs podem incluir números aleatórios utilizado para indexar os resultados individuais. Isto ilustra o fato de que é extremamente importante ser capaz de distinguir os resultados com base em alguns metadados. Se você não puder fazer isso, você está indo funcionar em grandes problemas.

Às vezes, porém, você não quer nenhum descritores de metadados. Se o POST executa um cálculo em que o resultado só é significativo em um contexto específico, então é da responsabilidade do cliente para manter o controle das ligações. Relacionando este conceito com um carrinho de compras, a maioria das lojas têm, e não há nenhum descritor de metadados. Quando você está em uma loja, você sabe que o carro pertence a você com base nos itens no carrinho. Não existe um identificador para o carro, e nas palavras de um grande comediante britânico, "Até que você compre o conteúdo em seu carrinho de compras, é uma ótima maneira de reorganizar o alimento em uma loja." Quero salientar que sim , você pode gerar resultados sem os metadados, mas essas situações são especializadas (e será contemplada no artigo 7). Ao executar um POST para a URL raiz, você está começando uma tarefa no lado do servidor. Iniciando tarefas em um servidor HTTP pode ser desafiador, pois os servidores HTTP esperar que todo o processamento para ser concluída quando o pedido termina. No entanto, devido à natureza dos dados, isso é possível, portanto, é necessário alargar o seu servidor.

Estendendo seu servidor pode ser tão simples como executar uma thread para executar a tarefa, ou pode significar fazer uma chamada inter para começar um processo para executar a tarefa. Independentemente de como você está executando a tarefa, o aspecto importante é a de não executar a tarefa no âmbito do pedido. O papel do POST é combinar os dados de uma tarefa, e então executar uma tarefa. Depois que o pedido tenha sido apresentado, o servidor deve retornar um identificador que representa a tarefa. O identificador pode ser o de metadados, um número aleatório, ou alguma ligação arbitrária. A informação retornada deve fornecer dados suficientes para que o cliente algorìtmica criar um link completo com os dados e metadados.

Se o POST não fornecer qualquer informação para, em seguida, o pressuposto é que o cliente sabe como compor os metadados e ligação a partir dos dados apresentados. A desvantagem desta estratégia é que, se o servidor muda de metadados lado, o código do cliente terá de ser actualizado.

 / pyservices / comerciante / histórico / tickers / DELL

Este URL representa a URL raiz de um resultado. Somente os verbos HTTP GET e DELETE são suportados. O verbo POST podem ser apoiados, se você desejar para recalcular o resultado de um pedido. A preocupação com a realização de um novo cálculo é que em uma situação multiusuário, outros usuários verão os novos dados e não estar ciente de que algumas partes dos dados foram alterados. De um modo geral, é melhor considerar um resultado como imutável. O verbo GET é suportado para permitir a recuperação dos resultados. O verbo DELETE é suportado para podar um resultado da lista. A poda é necessária para que o cache não tornar-se confuso com resultados de idade que não têm nenhum significado. No caso do pedido de cotação, DELETE não seria adequado, porque a história ticker é uma série de tempo, e você pode voltar o relógio. Podar uma série de tempo é apenas recomendado quando você tem alguns dados que é considerado velho e não é adequada para o contexto.

 / pyservices/trader/historical/tickers/DELL/2006

Este URL representa uma parte específica de um resultado e, se necessário, deve ser sempre apoiado. Apoio URLs criança em um resultado permite que o código do cliente para ajustar o resultado.

/ pyservices / comerciante / histórico / tickers / DELL? filtro = now

Este URL representa uma outra maneira de aperfeiçoar os resultados. Por exemplo, se um resultado gera muitos dados, usando o filtro com um valor de agora pode ajustar o resultado aos 15 passado. Ocasionais não correr o risco de resultados em falta. Por exemplo, digamos que você está esperando por todos os resultados de um cálculo e, portanto, periodicamente, chamar para recuperar os últimos 15 resultados. E se o período de seleção é uma hora, e durante uma hora, 30 resultados são gerados? Usando um filtro para recuperar os últimos 15 significa que você terá perdido 15 resultados. Você não deve usar uma abordagem baseada em tarefas ao recuperar os últimos 15 deletes1 para manter a estabilidade ea capacidade de reler os resultados que pode ser perdida se um navegador parou de baixar o dados. Você quer uma maneira de executar um aterramento onde o cache apenas de confiança ou um mecanismo de armazenamento é o servidor.

A melhor forma de ajustar os dados retornados é usar um cursor sobre o conjunto de resultados. Por exemplo, se existem 15 resultados de um cálculo, para além das URLs mencionado cada resultado deve ser referenciado utilizando um URL exclusivo para identificar o número resultado. Pense no número de resultados como sendo parte de uma série de tempo. Em uma série de tempo, você pode recuperar todos os carrapatos em uma hora, mas também todos os carrapatos em um minuto e todos os carrapatos em um segundo.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Usando a validação HTTP" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 392 users browsing the articles directory