Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rarylson Freitas

XmlHttpRequest

Recommended Posts

Pessoal, tenho um arquivo HTML simples com um código javascript que usa o objeto XmlHttpRequest.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http-~~-//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http-~~-//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
<script>
	window.onload = function() {	
		document.getElementsByTagName("input")[1].onclick = function() {
			var httpRequest = new XMLHttpRequest();
			var url = document.getElementById("url").value;
			httpRequest.open("GET", url, false);
			try {
				httpRequest.send();
			} catch (e) {
				alert(e);
			}
			document.getElementById("html").innerHTML = httpRequest.responseText;

			return false;
		};
	};
</script>
</head>
<body>
<form action="" onsubmit="return false;">
	URL: <input type="text" name="url" id="url" />
	<input type="button" value="Obter Página" />
	<div id="html"></div>
</form>
</body>
</html>

 

Por simplicidade, estou usando requisições síncronas.

Estou monitorando também as requisições usando o complemento para Firefox Firebug.

Bom, se eu coloco http://localhost no input url e clico em Obter Página, ocorre tudo bem. Na minha div#html é inserido o HTML que é a página inicial do Apache.

Se eu coloco http://localhost/ebgb na url (ebgb é um projeto que eu tenho no meu apache, feito em PHP) também ocorre tudo direito.

Neste último caso, além do GET http://localhost/ebgb, utilizado para pegar a página, o navegador envia outros GETs para pegar as imagens, folhas de estilo CSS, etc, como se eu tivesse digitado essa URL na barra de endereço do navegador e apertado ENTER...

Bom, o problema surgiu quando tentei requirir uma página externa usando GET (POST dá problema do mesmo jeito).

Coloquei http://www.google.com.br no input url, cliquei em Obter Página, e a div#html em nada se alterou.

Na verdade, no trecho

try {
	httpRequest.send();
} catch (e) {
	alert(e);
}
o método send() dispara uma excessão, e o código

Erro: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: http://localhost/ajaxteste/htmlrequest/ :: anonymous :: line 13"  data: no]
aparece na tela (devido ao alert).

Ao analisar o que o Firebug recebe, a requisição GET chega da seguinte forma

GET www.google.com.br; Status: 200 OK; Domain: google.com.br; Size: 1.9Kb; 
Cabeçalho de Resposta:
Date	Fri, 23 Jul 2010 19:21:17 GMT
Expires	-1
Cache-Control	private, max-age=0
Content-Type	text/html; charset=UTF-8
Set-Cookie	PREF=ID=42459516b85c6a6a:TM=1279912877:LM=1279912877:S=9kVzBICB1Cn8fbkm; expires=Sun, 22-Jul-2012 19:21:17 GMT; path=/; domain=.google.com.br NID=37=iHad65GWaMTj_AE61vfNPFXTHBksEPqaRJ1vUFkDA3eJO0eXWKGlIqGG-rW0eCmPyckFh1u8Y0T-U3RZOwoYAqQ-v0WwAFD2FbTKuGB_ZOjLD3A_h8UQQU88HrIhHNif; expires=Sat, 22-Jan-2011 19:21:17 GMT; path=/; domain=.google.com.br; HttpOnly
Content-Encoding	gzip
Server	gws
Content-Length	5632
X-XSS-Protection	1; mode=block
Cabeçalhos de Solicitação:
Host	www.google.com.br
User-Agent	Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	115
Connection	keep-alive
Referer	http://localhost/ajaxteste/htmlrequest/
Origin	http://localhost
Mas em Resposta a resposta vem vazia...

Bom, se alguém souber porque a requisição GET para sites externos não funciona e porque é disparada aquela excessão, agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo uma coisa que você precisa saber, o AJAX não aceita requisições de HOSTS externos(alguns navegadores até aceita, mas acusa algum erro as vezes), outra coisa sua aplicação ajax esta de maneira incompleta, falta adicionar a função onreadystatechange, pois você não está esperando a requesição completar, é como se você execulta-se o metodo HEAD ao inves de POST ou GET.

 

Leia:

http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

 

Anteciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não falta adicionar a função onreadystatechange e também não estou usando AJAX (a requisição é síncrona). Mas se estivesse usando a requisição se forma assíncrona daria erro do mesmo jeito (eu já testei...).

Bom, você disse:

o AJAX não aceita requisições de HOSTS externos

 

Por quê?

O cabeçalho do pacote HTML que vai na requisição GET por JavaScript é praticamente idêntico ao GET que vai pela requisição normal do navegador (digitar a URL na barra de ferramentas e apertar ENTER). A diferença é o cookie, que o XmlHttpRequest não envia. Mas para testar eu criei um cookie e enviei via XmlHttpRequest e deu erro do mesmo jeito. Ou seja, nesse caso, os cabeçalhos foram praticamente iguais, mas o pacote enviado via XmlHttpRequest deu erro, ao passo que o enviado pelo navegador via barra de endereço não dá erro.

Eu acreditava que, como as requisições são praticamente idênticas, nem sequer haveria como o servidor perceber se quem enviou a requisição usou XmlHttpRequest ou a barra de endereço do navegador. Até agora não entendi porque dá erro?

você também disse:

alguns navegadores até aceita, mas acusa algum erro as vezes

 

peraê, é o AJAX que não permite requisições de HOSTS externos, é o navegador que não aceita uma requisição externa feita por AJAX, ou é a implementação do JavaScript de navegadores específicos que não permitem tais requisições?

Li a especificação do XmlHttpRequest e não vi nada a respeito sobre AJAX não aceitar requisições externas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

é o navegador que não aceita uma requisição externa feita por AJAX

O é considerado falha de segurança pelo navegador.

 

Vou testar sua, função.

[Editado]Realmente o navegador não aceita requisições de HOSTS externos (falha de segurança).

Compartilhar este post


Link para o post
Compartilhar em outros sites

é o navegador que não aceita uma requisição externa feita por AJAX

O é considerado falha de segurança pelo navegador.

 

Vou testar sua, função.

[Editado]Realmente o navegador não aceita requisições de HOSTS externos (falha de segurança).

 

Pelo que pesquisei, a exceção NS_ERROR_FAILURE é disparada por um componente próprio do navegador Firefox, e não uma exceção JavaScript. Sendo assim, você está certo, quem dispara a exceção é o navegador. Algumas versões antigas do IE, pelo que também pesquisei,não disparam esta exceção.

Pesquisando na internet (principalmente em fóruns americanos, dentre eles o da Mozilla) li sobre alguns algoritmos que poderiam causar falhas de segurança caso fosse permitido a execução de JavaScript sobre o conteúdo de outros domínios, o que também confirma o que você disse que os navegadores não permitem acesso via XmlHttpRequest para outros domínios por motivos de segurança.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... mas ai vem uma coisa interessante... e como o método $.getScript() do jQuery consegue??

 

com ele é possível fazer requisições assincronas para outros dominios..

lógico que ele só aceita retorno no formato jSON, talvez ele crie um <script> e taque o retorno dentro, ai temos javascript com javascript..

pelo menos foi a única coisa que pensei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deve ser semelhante aos métodos explicados no artigo Cross-domain communications with JSONP, Part 1: Combine JSONP and jQuery to quickly build powerful mashups da IBM.

O nome do princípio que impede acessar programaticamente elementos de outro domínio chama-se Same Origin Policy. Naturalmente, existem algumas exceções a este princípio, como inserir imagens de outro domínio ou carregar javascripts externos.

Bom, mas até agora não sei como acessar programaticamente um site externo à minha aplicação.

Um exemplo (sem sentido, mas é um exemplo): como faço para varrer a página do Google e imprimir na minha tela a action do formulário de pesquisa? Se eu for manualmente no site e navegar pelo código fonte, vou encontrar

<form action="/search" ... />
e descobrir que a resposta é /search, mas não foi um programa JavaScript que resolveu isto para mim.

Alguém sabe como eu posso fazer isso (usando JavaScript). Se alguma biblioteca pode fazer isso, como ela faz? Sei fazer isso em Python, (sei também que tem como fazer em Java), mas queria saber se com javascript é possível fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.