Content Negotiation
Por: Saturday 25 March 2006 às 11:07 AM
Nestes últimos dias, andei lendo bastante sobre um assunto que despertou bastante minha curiosidade, vou descrever o pouco que entendi sobre este assunto, o qual, achei muito interessante, caso eu cometa algum erro, sinta-se a vontade para corrigir, pois ainda estou aprendendo.
O assunto deste post é content negotiation, mas afinal de contas, o que é content negotiation?
Content negotiation é a forma como o servidor, no caso de PHP rodando em ambiente Linux, Apache, negocia com os user agent (Browser, Mecanismos de busca, e outros) a requisição de cada documento, nesta “negociação” o user agent informa quais media types (também chamado de content type e MIME type) ele pode interpretar. Um exemplo prático: No caso de você possuir duas imagens iguais, uma GIF e uma PNG, alguns browsers, como é o caso do ie, não interpretam PNG, então o user agent browser, fala para o servidor quais tipos MIME ele pode interpretar, então o servidor ao invés de enviar a imagem PNG, envia a imagem no formato GIF, pois é um formato que o user agent pode interpretar corretamente.
Em suma, o user agent anuncia quais MIME ele pode interpretar no header da página e envia para o servidor, este header especificamente é chamado de Accept, um exemplo do header Accept do Firefox é:
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, image/png, image/jpeg, image/gif;q=0.2, */*;q=0.1
Agora que todo mundo já sabe o que significa content negotiation, vamos ao verdadeiro propósito deste post, que além de descrever um pouco do que é content negotiation, tem como objetivo falar um pouco sobre um MIME específico que é o application/xhtml+xml, pois não sei se todos sabem, mas documentos XHTML, podem utilizar o MIME application/xhtml+xml, mas o único problema é que nem todos os browsers suportam o MIME application/xhtml+xml, como vimos no exemplo acima, o Firefox aceita este MIME, já o ie não.
Mas e se por um acaso eu quiser enviar meus documentos XHTML com o MIME application/xhtml+xml? Eu não posso?
É claro que você pode, mas se você enviar as páginas diretamente com MIME application/xhtml+xml, o ie não vai nem abrir sua página, então quer dizer que eu não posso utilizar application/xhtml+xml em meus documentos!
Poder você pode, mas antes disso você tem que utilizar um pequeno trecho de código para que funcione corretamente em todos os browsers, e por exemplo o ie consiga acessar sua página sem problemas, vou apresentar agora um pequeno trecho de código para que este problema seja resolvido, lembrando que este trecho de código foi retirado de uma de minhas referências.
<?php
if ( stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml" ) ||
stristr($_SERVER["HTTP_USER_AGENT"], "W3C_Validator" ) ):
header("Content-Type: application/xhtml+xml; charset=utf-8");
header("Vary: Accept");
echo("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
else:
header("Content-Type: text/html; charset=utf-8");
header("Vary: Accept")
endif;
?>
Basicamente o que este trecho de código faz é, caso o user agent aceite em seu MIME application/xhtml+xml, ou o user agent seja o W3C HTML Validator, o documento será enviado como application/xhtml+xml, caso o user agent não aceite, o documento será enviado como text/html.
Montei dois exemplos somente para mostrar o que acontece no caso de um MIME sendo enviado como application/xhtml+xml diretamente e outro sendo tratado com o exemplo que apresentei. A primeira página que envia o MIME como application/xhtml+xml diretamente pode ser acessada aqui, já um segundo exemplo que trata o MIME pode ser acessada aqui. Quem quiser baixar o primeiro exemplo basta clicar aqui, e o segundo exemplo aqui.
Um benefício ao se enviar o MIME como application/xhtml+xml, é que você nem precisa ficar validando seu site através do W3C HTML Validator, pois browsers como o Firefox, que são baseados no engine Gecko, mostram mensagens de erro e warnings, caso seu documento não seja válido, em contrapartida se pensarmos em um blog, e imaginarmos que a área de comentários é livre e nem todos precisam saber todas as regras de validação da W3C para postar em seu blog, caso algum comentário apresente algum erro, sua página ficará exibindo este erro até que o administrador do blog edite e arrume todos os erros e warnings, isso não é muito bom.
Existem plugins para o wordpress que analisam os comentários para testar qualquer tipo de erro e corrigi-los, mas nunca usei, e não sei da eficiência destes na correção.
Por enquanto é só isso, quem quiser saber mais sobre o assuto, pode visitar os endereços que usei como referência para este artigo, peguei um pouco de idéia de cada um, alguns trechos podem estar até bem parecido, mas tentei ao máximo explicar com minhas próprias palavras, vale acessar estes artigos, pois apresentam outros exemplos de modificação do MIME para application/xhtml+xml em outras linguagens e muitas outras informações:
Content negotiation | 456 Berea Street
Content Negotiation @ The Autistic Cuckoo
Keystone Websites: Serving up XHTML with the correct MIME type
Vou estudar mais e quem sabe num próximo artigo, aprofundar mais nestes e em outros assuntos semelhantes.
Como eu já disse no início do post, caso eu tenha cometido algum erro, fique a vontade para corrigir, criticar, dar idéias, e explicar melhor algum trecho que tenha ficado meio obscuro, pois como ja disse, estou aprendendo.
Artigos relacionados:
Tags: Content Negotiation Firefox MIME PHP Programação Tecnologia XHTML
















# 1° Alessandro S. Angeruzzi March 25th, 2006 às 1:14 PM GMT
Flávio, Gostei. Já estou procurando uma maneira de fazer isso em Asp.Net também.
Só uma dúvida, vc sabe se o user agent do google aceita o mime “application/xhtml+xml” ?