27th ago 2009

XMLHttpRequest cross-site: mais uma vez o IE fora do padrão

Uma questão fortemente levantada para quem implementa interfaces web é a das requisições assíncronas feitas por javascript não poder ser feitas de um domínio para o outro (por exemplo, um javascript hospedado em http://minhaurl.com não consegue acessar nenhuma outra url em outro domínio, como http://aquelaurl.com)

Tem há algum tempo a especificação 2 do XMLHttpRequest que possibilita essa funcionalidade, chamada de CORS: Cross-Origin Resource Sharing
Basicamente, é uma troca de headers específicos entre cliente e servidor para formalizar e garantir a origem da requisição.

Ulá-lá, isso é uma mão na roda!

E é mesmo! Abrem-se muitas portas: muitos mashups podem ser feitos, muitas coisas que antes necessitavam de backend podem ser resolvidas apenas na camada de interface, dentro outras – claro, sempre levando em conta questões de segurança, como tomar muito cuidado em como você vai expor seus dados por aí pela web, e tomar extra-care quando se tratar de requisições que podem alterar dados persistidos na sua aplicação.
A essa funcionalidade, de fazer requisições entre servidores, é dado o apelido XDR (X de cross, D de domain, R de request).

O foco desse post, no entanto, não é falar da implementação em si, até porque eu não conseguiri escrever nada melhor do que foi escrito pelo hacks.mozilla, mas sim falar que novamente a Microsoft atrapalha os padrões (aliás, vejam com cuidado esse post no hacks.mozilla: completíssimo, com exemplos de implementação, notas, dicas e poréms).

Os browsers Firefox 3.5 e Safari 4 implementam já essa especificação 2 do XMLHttpRequest, mas o recém-lançado IE8 implementa “uma parte” apenas. E para isso, criaram um novo objeto, o XDomainRequest

Veja um exemplo de como fazer a instanciação correta de um objeto para ser utilizado, que pode fazer XDR:

var url = "http://bar.other/publicNotaries/"
if(XMLHttpRequest) {
var request = new XMLHttpRequest();
if("withCredentials" in request) {
// Firefox 3.5 and Safari 4
request.open('GET', url, true);
request.onreadystatechange = handler;
request.send();
} else if (XDomainRequest) {
// IE8
var xdr = new XDomainRequest();
xdr.open("get", url);
xdr.send();
// handle XDR responses -- not shown here
}
// This version of XHR does not support CORS
// Handle accordingly
}

*nesse código, é usado o atributo withCredentials para verificar se é um objeto que pode fazer o cross-site (ele é específico do CORS)

Agora, note que novamente é preciso fazer uma verificação de qual é o objeto ao qual o browser tem acesso, que nem se faz tradicionalmente, só que dessa vez checando se possui o XDomainRequest ao invés do ActiveXObject(‘Msxml2.XMLHTTP’)

Porque raios a Microsoft não implementa esse objeto na engine do browser e segue um padrão, inclusive definido pela W3C, e facilita a vida? Não vejo um só motivo para continuar com essa coisa de sempre tentar usar um objeto diferente, único e próprio. Ainda mais agora que estão numa campanha pró-adoção do IE8 por parte inclusive dos desenvolvedores…

Posts relacionados

Avalie

1 estrela2 estrelas3 estrelas4 estrelas5 estrelas (No Ratings Yet)

6 Responses to “XMLHttpRequest cross-site: mais uma vez o IE fora do padrão”

  1. Diogo Souza says with Opera on Linux

    Coisa de sobrinho isso, hein?!

    A MS não gosta mesmo de padrões, sempre tem que empurrar algo diferente sem razão alguma.

  2. Helen Fernanda says with Chrome on Linux

    Não vejo um só motivo para continuar com essa coisa de sempre tentar usar um objeto diferente, único e próprio. [2]

  3. Alexsandro says with Firefox on Windows Vista

    Acho que eu sei pq.. A MS quer ser o padrão, dai por questoes de ego quer impor a sua tecnologia dizendo que é a melhor e mais eficiente.

  4. Helen Fernanda says with Firefox on Windows XP

    Aí é que tá: a Microsoft já foi o padrão, o que falta é ela se tocar que as coisas mudaram muuuuuuuito nos últimos anos.

  5. Chris says with Firefox on Mac Os X 10.5

    Mesmo a W3C sendo lenta demais em algumas coisas – por isso tá ai o Webkit fazendo um monte de coisas da especificação 3 do CSS que nunca saíram do papel – não dá pra passar por cima toda a vez…
    O que me dá raiva nem é essa atitude da MS em si – de criar algo fora do padrão – mas sim fazer isso num momento em que pregam estar do lado desses padrões… :(

  6. John Nash says with Firefox on Windows -1

    gostei do artigo , parabéns

Leave a Reply