Content Negotiation

Por: Flávio Theruo KaminisseSaturday 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

X-Valid: XHTML validifier

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

11 Comentários para “Content Negotiation”

# 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” ?

# 2° Flávio Theruo Kaminisse March 26th, 2006 às 4:16 PM GMT

Hum, boa pergunta Alessandro, sinceramente não sei, mas vou pesquisar, assim que encontrar alguma coisa escrevo aqui.

# 3° Mudei meu mime-type » Revolução Etc March 28th, 2006 às 1:27 PM GMT

[...] O namespace xmlns deve ser declarado (mesmo que o validador não acuse isto como um erro) Se quiser que seu site seja exibido no Internet Explorer você precisa criar uma negociação de conteúdo para servir text/html para o IE. [...]

# 4° O mime-type do Japs agora é application/xhtml+xml » Japs March 28th, 2006 às 1:31 PM GMT

[...] Aproveitando os estudos realizados no último post sobre content negotiation, e um pequeno empurrãozinho do Henrique, resolvemos utilizar o script do artigo anterior e deixar que todas as páginas XHTML fossem enviadas como application/xhtml+xml. [...]

# 5° Rhawbert Costa April 28th, 2006 às 4:59 PM GMT

Olá Sr. Kaminisse

A sintaxe do codigo php (que tu retirou de uma das suas referências) estava usando uma sintaxe no “modo reduzido” e por alguma razão não funcionou no meu ambiente de testes… eu não sou nenhum expert em PHP… mas vi que faltavam algumas barras de escape na linha 4.. enfim vou tentar postar o código corrigido aki… não sei se o seu wordpress vai aceitar.

< ?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(“\n”);}
else{
header(“Content-Type: text/html; charset=utf-8″);
header(“Vary: Accept”);
}
?>

# 6° Rhawbert Costa April 28th, 2006 às 5:01 PM GMT

é… lamento, não funcionou mesmo…

# 7° Pedro Rogério May 5th, 2006 às 11:22 PM GMT

Fiz isso lá no meu site também, funcionou beleza, se é para seguir os padrões, vamos seguir!!!!

# 8° asd May 29th, 2006 às 12:55 PM GMT

teste

# 9° NOVO LAYOUT NO PINCELADASDAWEB.COM.BR » Pinceladas da Web - Reflexões sobre XHTML, CSS, PHP e WebStandards February 23rd, 2007 às 11:31 PM GMT

[...] 23-02-2007>Tutorial para quem não sabe o que é Content [...]

# 10° Negociação de conteúdo - RafaelMarin.net April 3rd, 2007 às 7:23 PM GMT

[...] Content negotiation – Japs.etc.br [...]

# 11° Mudei meu mime-type ≈ Revolução Etc August 22nd, 2010 às 12:13 PM GMT

[...] quiser que seu site seja exibido no Internet Explorer você precisa criar uma negociação de conteúdo para servir text/html para o [...]

Avisos
Os ítens com asterisco ( * ) são campos de preenchimento obrigatório.
Todos os links inseridos nos comentários possuem o atributo rel="nofollow" para impedir com que user agents (como os mecanismos de busca) sigam os links inseridos para desestimular spammers.
Todos devem se identificar através de e-mail válido.
Os e-mails dos usuários não serão divulgados no site.
Comentários:
  • Sigam-me no Twitter

Sobre o Japs

Foto do autor Flávio Theruo Kaminisse O Japs é o site pessoal do Flávio T. Kaminisse, atualmente trabalha com Análise de sistemas na Webroom Soluções Interativas, é formado em Ciência da Computação pela Universidade Federal de Uberlândia, é também especialista em Banco de Dados, tendo concluído sua pós-graduação pela Unitri, gosta de mexer um pouco com Linux, é responsável pela área de TI do Charges.com.br e Webinsider, e ainda arruma um tempinho para escrever sobre tecnologia, javascript, AJAX, desenvolvimento e outros assuntos interessantes por aqui. Leia mais.

Você ainda não tem estes livros na sua biblioteca? Cuidado! Você está ficando desatualizado.

  • Sistemas de Banco de Dados - Ramez E. Elmasri, Shamkant Navathe
  • PHP: a Bíblia - Tim Converse, Joyce Park
  • MySQL: a Bíblia - Steve Suehring
  • Fundamentos do Ajax - Ryan Asleson, Nathaniel T. Schutta
  • Hackers Expostos - Stuart Mcclure, Joel Scambray, George Kurtz
  • PHP 5: Programação Poderosa - Gutmans, Bakken, Rethans
  • Não me faça pensar! - Steve Krug
  • Google Adwords a Arte da Guerra - Ricardo Vaz Monteiro
  • Sandman - Neil Gaiman
  • The Art and Science of Web Design - Jeffrey Veen
  • Ansiedade de Informação 2 - RICHARD SAUL WURMAN
  • Mobile Web Design - Cameron Moll

838 assinantes Assine o feed do Japs

Artigos por e-mail

Receba os últimos artigos do Japs no seu e-mail.


Encontre-me

O Japs recomenda

Blogs amigos:

Alguns sites e blogs que valem a pena ser visitados:

Pessoas que trabalham comigo:

Sites dos colegas de trabalho na Webroom.

Já trabalharam comigo: