Mashup Slideshare - Acessar Iframe que gera uma resposta XML[RESOLVIDO]

Pessoal a dúvida é “meio” OFF-TOPIC, mas vamos lá…

Estou desenvolvendo um mashup integrando uma aplicação com a API do Slideshare. Meu problema é o seguinte: Ao tentar fazer um upload de arquivos, basicamente preciso criar um form submetendo via post alguns parâmetros incluindo um input file. para uma url deles(http://www.slideshare.net/api/1/upload_slideshow).

Obtendo sucesso ou não no upload, eu recebo um xml com o id do arquivo “uploadeado”, ou uma mensagem de erro, mas sempre por xml . Idealmente seria uma ação tipicamente assícrona, já que preciso recuperar o id do arquivo “uploadeado” primeiro, e depois finalizar a operação que realizo em minha tela. Infelizmente, não posso usar ajax pois a submissão precisa do file, e só é possível enviar parâmetros via string…

A partir daí venho quebrando a cabeça pensando em alternativas, criei um iframe na minha página e pensei em tentar recuperar o conteúdo, seja texto, seja xml, a partir de javascript, mas não consigo de jeito nenhum saber como recuperar esses dados. Já tentei getElementsByTagName, documentElement, innerText, window.frames, mas não consigo de jeito nenhum… Existe uma forma de eu conseguir recuperar esse xml que vem como resposta dessa submissão via Javascript, DOM ? Algum daqueles frames JS tipo Prototype, Dojo que possa ajudar em algo?


“Avancei” um pouco mais em meu problema…

Se eu coloco o iframe como sendo um jsp ou xml, consigo acessar o iframe de duas formas:

document.getElementById(‘idFrame’).Document no IE
ou
document.getElementById(‘idFrame’).contentDocument no FF
ou window.frames[‘idFrame’],

O problema é que quando eu submeto o form que está no iframe, cujo action aponta pra outro domínio, não consigo acessá-lo da minha página pai, pois o sandbox dos browsers bloqueia por segurança :frowning: Acho que essa abordagem que tentei não deve funcionar… Existe algum jeito de eu resolver esse meu problema de outra maneira? Basicamente preciso submeter o form pra um action fora do meu domínio e recuperar o xml que ele gera como resposta. Alguém me corrija se existe algum jeito, mas que eu saiba não, de utilizar Ajax pra obter essa resposta , já que minha submissão tem um campo file :frowning:

Fala meu velho…
Pensei a seguinte maneira…
é meio marreta mais vai resolver…
vc vai fazer uma servlet a qual vc vai submeter seu formulário.

so que a diferença é que nessa servlet ela que vai se comunicar com a API que vc quer e lhe dar um retorno que vc vai pegar e fazer os tratamentos que lhe cabem.

“Tamo junto” aqui também :slight_smile:

O que ele chama de “API” é só um conjunto de parâmetros que você direciona pra uma url, e ele te devolve sempre um xml, vide documentação . O que mata é que não sei como é o processamento dessa url, em que linguagem foi feita. E precisaria obter o response da action dele , pra dai sim retornar o xml. Posso tentar, mas acho que não deve rolar, será que eu consigo criar uma servlet, nela eu chamo meu dispatcher pra redirecionar pra url do slideshare, e usar um filtro pra interceptar o “retorno”? Acho que não funciona.

Já tentei usar Javascript + XML DOM, Applet interagindo com Javascript, URLConnection, HttpUnit, mas basicamente precisaria concatenar a url com parâmetros, o que não posso fazer devido a trabalhar com file na submissão.

Não consigo usar a abordagem XML Dom porque a url está em outro domínio, e ai acho que só se na própria implementação deles fosse permitido que fossem feitas esse tipo de chamadas. Já escrevi pra eles pra tentar entender se vai ter jeito de fazer como eu quero, porque pelo jeito que está tá dificil :frowning:

Finalmente saiu !!

Quem me ajudou foi a combinação FileUpload com HttpClient.

Basicamente eu crio um PostMethod, e seto os parâmetros string e input (que recupero via fileupload):

            PostMethod metodo = new PostMethod("http://www.slideshare.net/api/1/upload_slideshow");
	    metodo.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, true);	
	    NameValuePair par1 = new NameValuePair("api_key","api_key");
            NameValuePair par2 = new NameValuePair("ts",String.valueOf(new java.util.Date().getTime()));
            NameValuePair par3 = new NameValuePair("hash",CriptoUtils.obterHash());
            NameValuePair par4 = new NameValuePair("slideshow_tags","mashup ajax web2.0");
            NameValuePair par5 = new NameValuePair("make_src_public","Y");
            metodo.setQueryString( new NameValuePair[]{ par1, par2, par3, par4, par5} );
			
  	    metodo.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
		    		new DefaultHttpMethodRetryHandler(2, false));
			
	    ByteArrayPartSource baps = new ByteArrayPartSource(nomeArquivo, bytesStr.toByteArray());
			
	    Part[] parts = {new FilePart("slideshow_srcfile", baps)	
				  };
             MultipartRequestEntity mre = new MultipartRequestEntity(parts,metodo.getParams());
			metodo.setRequestEntity(mre);

             HttpClient cliente = new HttpClient();			
	     int status = cliente.executeMethod(metodo);
             System.out.println("metodo.getResponseBodyAsString()");
             metodo.releaseConnection();

Nesse Array de Parts eu poderia passar os meus parâmetros usando StringPart, mas por algum motivo isso estava me trazendo erro no retorno, substitui por NameValuePair e finalmente tenho o xml de que preciso. Aparentemente na documentação não vi nada que me obrigasse a usar NameValuePair no lugar de StringPart quando trabalhar com POST e Multipart, de qualquer sorte fica aqui o registro. Salve a Apache!!

Só complementando,

Vi acho que aqui pelo guj outro dia, alguém querendo usar o HttpClient com proxy, é simples assim:

HttpClient cliente = new HttpClient(); HostConfiguration hConf= cliente.getHostConfiguration(); hConf.setProxy("ENDERECO_PROXY", 3128);

Conectando via proxy com autenticação: