Ir para conteúdo

POWERED BY:

Arquivado

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

gitavares

Consumir um XML..

Recommended Posts

Oi gente, seguinte, primeira vez que vou tentar consumir um XML e nem sei por onde começar. Já li vários tutoriais, mas nenhum se encaixa com o que eu preciso. Seguinte: estou tendo que usar o webservice do MasterCard (Redecard), no qual passo os valores via form para o webservice deles. Assim:

<form action="https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx/GetAuthorizedTst" method="post" ><input type="hidden" name="Total" value="<%=Total%>"><input type="hidden" name="Transacao" value="<%=Transacao%>"><input type="hidden" name="Parcelas" value="<%=Parcelas%>">(...)</form>

daí essa página me retorna um XML assim (não liguem para os valotes do retorno, ok?):

<?xml version="1.0" encoding="utf-8" ?> - <AUTHORIZATION>  <CODRET>27</CODRET>   <MSGRET>PROBLEMAS+COM+O+CARTAO.+TENTE+NOVAMENTE</MSGRET>   <NUMPEDIDO>082449156</NUMPEDIDO>   <DATA />   <NUMAUTOR />   <NUMCV />   <NUMAUTENT />   <NUMSQN />   <ORIGEM_BIN />   </AUTHORIZATION>
que vem no endereço

https://ecommerce.redecard.com.br/pos_virtu...etAuthorizedTst

Só que isso vai ser mostrado para o cliente, e obviamente não deve ser assim... como trato esse arquivo que é externo? não sei por onde começar... Ah! uso ASP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estude ajax, e em seguida estude a propriedade responseXML do XMLHttpRequest.

 

Ela te permitirá capturar esse valor aí e formatar do jeito que quiser...

Compartilhar este post


Link para o post
Compartilhar em outros sites

seguinte, eu fiz os testes que tinha lá, e adorei o que eu li de ajax. apliquei e todos os testes dali funcionaram, mas não consegui aplicar à minha situação. se fosse um xml que eu tivesse feito, eu saberia tratar. o que acontece é que meu form envia os dados para uma página externa, e essa traz outra página externa. não sei como fazer pra tratar isso...

 

meu form envia para https://ecommerce.redecard.com.br/pos_virtu...etAuthorizedTst e a mesmissima página é retornada, só que com o xml.. não entendo como isso funciona..

 

o exemplo da operação que me foi fornecida está nesse link: https://ecommerce.redecard.com.br/pos_virtu...etAuthorizedTst

 

eu sei que isso é um tipo de documento padrão, mas não entendo o que vou utilizar dele. então peguei o fomr e estou enviando para o mesmo endereço que esse form está enviando. quem já usou webservice para o sistema da redecard deve saber muito bem como funciona isso, então se tiver alguém aqui que já fez isso, por favor me ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ummm é mesmo. É verdade. Esqueci que o XMLHttpRequest só aceita coisas do próprio domínio.a solução que eu vejo pra voce é o seguinte:1) Voce terá que enviar seu form para uma página SUA e não para a deles.2) Daí sua página PHP (ou ASP, etc) recebe o conteúdo do form e reenvia para o site DELES.3) Seu PHP recebe a resposta, trata e exibe pro usuário.Voce já entrou em contato com o suporte deles ou já deu uma navegada no site deles. Talvez haja outra solução melhor.De quelquer forma, informe a linguagem server-side que voce está usando pra eu mover este tópico, que eles poderão desenvolver melhor a idéia anterior que eu passei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tô usando ASP :)e na verdade estou usando um página minha, depois que passo para a deles. está funcionando desse jeito:1. Página preenchida pelo usuário2. Página que recupera as informações do usuário nessa página que recupero as infos do usuário, como os dados precisam ser enviados via POST, coloquei um form que é enviado automaticamente ao ser carregada essa página. então leva pra eles as informações que o usuário digitou e mais outras que são requeridas, mas que o usário não precisa saber.3. Página da redecard que retorna o XML, e que eu não estou conseguindo tratar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como voce chega até a página da redecard?? É seu asp que vai até lá ou o user que clica no submit?PS.: Vou mover pro fórum de asp

Compartilhar este post


Link para o post
Compartilhar em outros sites

funciona assim: após o usuário digitar seus dados, a minhá página (tec-cartao-master.asp) recupera os dados do cliente e em seguinte, acrescentei ao código o seguinte:

 

<body onload="document.forms[0].submit();"><form action="https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx/GetAuthorizedTst" method="post" >	<input type="hidden" name="Total" value="<%=Total%>">	<input type="hidden" name="Transacao" value="<%=Transacao%>">	<input type="hidden" name="Parcelas" value="<%=Parcelas%>">	<input type="hidden" name="Filiacao" value="<%=Filiacao%>">	<input type="hidden" name="NumPedido" value="<%=NumPedido%>">	<input type="hidden" name="Nrcartao" value="<%=Nrcartao%>">	<input type="hidden" name="CVC2" value="<%=CVC2%>">	<input type="hidden" name="Mes" value="<%=Mes%>">	<input type="hidden" name="Ano" value="<%=Ano%>">	<input type="hidden" name="Portador" value="<%=Portador%>">	<input type="hidden" name="IATA" value="<%=IATA%>">	<input type="hidden" name="Distribuidor" value="<%=Distribuidor%>">	<input type="hidden" name="Concentrador" value="<%=Concentrador%>">	<input type="hidden" name="TaxaEmbarque" value="<%=TaxaEmbarque%>">	<input type="hidden" name="Entrada" value="<%=Entrada%>">	<input type="hidden" name="Pax1" value="<%=Pax1%>">	<input type="hidden" name="Pax2" value="<%=Pax2%>">	<input type="hidden" name="Pax3" value="<%=Pax3%>">	<input type="hidden" name="Pax4" value="<%=Pax4%>">	<input type="hidden" name="Numdoc1" value="<%=Numdoc1%>">	<input type="hidden" name="Numdoc2" value="<%=Numdoc2%>">	<input type="hidden" name="Numdoc3" value="<%=Numdoc3%>">	<input type="hidden" name="Numdoc4" value="<%=Numdoc4%>">	<input type="hidden" name="ConfTxn" value="<%=ConfTxn%>">		<script LANGUAGE=javascript>	<!--		function submit(){			document.forms[0].submit();		}	//-->	</SCRIPT>	</form></body>

ou seja, através do javascript ele envia o form assim que a página é lida.

 

veja que ele envia os dados para a página: https://ecommerce.redecard.com.br/pos_virtu...etAuthorizedTst

 

e nessa mesma página, ele carrega o xml, que aparece da seguinte forma:

<?xml version="1.0" encoding="utf-8" ?> - <AUTHORIZATION>  <CODRET>27</CODRET>   <MSGRET>PROBLEMAS+COM+O+CARTAO.+TENTE+NOVAMENTE</MSGRET>   <NUMPEDIDO>112551156</NUMPEDIDO>   <DATA />   <NUMAUTOR />   <NUMCV />   <NUMAUTENT />   <NUMSQN />   <ORIGEM_BIN />   </AUTHORIZATION>

Se eu clico com o botão direito para ver o endereço dessa página, aparece a mesma que coloquei no formulário.

 

O pessoal da redecard oferece apenas um manual dizendo o que é cada parâmetro e oferece como escopo o seguinte link: https://ecommerce.redecard.com.br/pos_virtu...omerci/cap.asmx

 

Lá você vai buscar por GetAuthorizedTst, que é o último link, e é de teste (por isso o Tst no final do nome da operação). clicando aí você verá um exemplo dessa operação. tem, além do form, SOAP, HTTP GET e HTTP POST. estou usando o form, porque nem sei se é pra eu usar algum outro método daquele.

 

tô completamente perdida...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê uma olhada no "Laboratório de Scripts" um post sobre como ler um arquivo RSS, com ele já terá uma base para enviar e tratar esse retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Graande salgado.

 

Mastigando: RSS em ASP

 

 

Daí, Giselle, vai ficar melhor pra voce enviar usando o exemplo HTTP GET deles. Daí , no exemplo do salgado, é só voce substituir a url por sua url formatada, e não vai ser preciso ficar criando a tag form...

 

Té mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Viche vamos lá!Gisele, conheces Microsoft.XMLHTTP?Essa coisa ai deve ajudar. Com ele, tu pode puxar informações de servidores externos através de requisições GET.Se encontrar dúvidas, entre em contato comigo que eu faço uma function para o teu caso.Higorwww.Higor.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

mhhh... sobre o RSS, entendi perfeitamente como funciona, mas também não se aplica ao que preciso... porque não vou ter uma página para recuperar esses valores do XML. não tenho como fazer um redirect ou sei lá o quê quando eu tiver o retorno da transação. Também esse xml não será uma arquivo que vai ficar sempre gravado lá na redecard. ele só serve para aquele momento em que o usuário faz o patrocínio.para teste, na mesma página onde envio o form, coloquei abaixo dele aquele código do RSS, trocando apenas o endereço. só para teste. Apareceu rapidamente a mensagem "Nenhuma notícia na fonte", claro. e logo em seguida, fez um redirect para o XML.se eu tivesse alguma forma de fazer um redirect, sei lá, após o XML ser carregado, acho que resolveria meu problema... mas não tô vendo como fazer isso...e não! não conheço Microsoft.XMLHTTP... as únicas vezes que mexi com xml foi simples. eu criei o xml e o consumi através de um codigos em actionscript.. muito simples. desse jeito que está, tá difícil, porque depois que o form é enviado, fica tudo por conta deles.. tipo, não posso mais fazer programação nenhuma depois do código do form... e não posso fazer nenhuma programação depois do retorno, pra ele fazer um redirect...estou entrando em desesperoooo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, então vamos lá...Maos à obra:1) Como ficou sua linha: blnLoaded = objXML.Load(url) ??De acordo com minhas viagens aqui ele deveria ter ficado:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então. ela ficou assim:

 

<%' Script ASP Para leitura de arquivos de RSS.url = "https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx/GetAuthorizedTst?Total="&Total&"&Transacao="&Transacao&"&Parcelas="&Parcelas&"&Filiacao="&Filiacao&"&NumPedido="&NumPedido&"&Nrcartao="&Nrcartao&"&CVC2="&CVC2&"&Mes="&Mes&"&Ano="&Ano&"&Portador="&Portador&"&IATA="&IATA&"&Distribuidor="&Distribuidor&"&Concentrador="&Concentrador&"&TaxaEmbarque="&TaxaEmbarque&"&Entrada="&Entrada&"&Pax1="&Pax1&"&Pax2="&Pax2&"&Pax3="&Pax3&"&Pax4="&Pax4&"&Numdoc1="&Numdoc1&"&Numdoc2="&Numdoc2&"&Numdoc3="&Numdoc3&"&Numdoc4="&Numdoc4&"&ConfTxn="&ConfTxn 'Aqui vai o endereço do arquivo RSS, ou do arquivo "gerador"' Criando Objeto XMLSet objXML = Server.CreateObject("msxml2.DOMDocument.3.0") objXML.async = false objXML.setProperty "ServerHTTPRequest", True ' Não validar o arquivoobjXML.validateOnParse =false' true ' Retirar espaços objXML.preserveWhiteSpace = false blnLoaded = objXML.Load(url) If Not blnLoaded Then 	Response.write "Nenhum notícia na fonte!" Else	set objNodeList = objXML.getElementsByTagName("channel") 	For Each objNode In objNodeList 		For Each objNode2 In objNode.childNodes 		Select Case objNode2.nodeName 		Case "title" 			html = html &"<tr><td><b>"			html = html &objNode2.firstChild.nodevalue 			html = html &"</b></td></tr>"		Case "link" 			html = html &"<tr><td><a target=_blank href="& objNode2.firstChild.nodevalue &">"			html = html & objNode2.firstChild.nodevalue 			html = html &"</a></td></tr>"		Case "description" 'Está desabilitado para exibir apenas os links			html = html &"<tr><td><i>"			html = html & objNode2.firstChild.nodevalue 			html = html &"</i></td></tr>"		End Select 		Next	Next 	html = html &"<tr><td><hr></td></tr>"	Set objNodeList = objXML.getElementsByTagName("item") 	For Each objNode In objNodeList 		For Each objNode2 In objNode.childNodes 			Select Case objNode2.nodeName 			Case "title" 				strTitle = objNode2.firstChild.nodevalue 			Case "link" 				strURL = objNode2.firstChild.nodevalue 			Case "description" 				strDescription = objNode2.firstChild.nodevalue 			End Select 		Next 		html = html &"<tr><td><li/><b><a target=_blank href="& strURL &">"& strTitle &"</a></b><br>"& strDescription &"</td></tr>"		strTitle = "" 		strURL = "" 		strDescription = "" 	Next 	html = "<table>"& html &"</table>"	set objNodeList = Nothing End if %><%Response.write (html)%>

eu nao tinha colocado aqueles parametros antes. mas agora que coloquei, apareceu simplesmente um "." PONTO. e mesmo assim, ele mostra rapidamente essa tela e depois passa para o xml.

 

encontrei um tutorial que faz o que eu quero, mas ele está usando asp.net e usando o visual studio, ou seja, não mostra o código pra eu adaptar... esse é o link: http://www.microsoft.com/brasil/msdn/tecno...services_4.aspx

 

observe que ele tem um webservice que calcula o frete, que também retorna um xml, igualzinho ao meu caso. só que depois ele usa o visual studio e chama esse xml para ser mostrado no form disponível para o usuário, mostrando nas labels os valores desse cálculo, que é justamente o retorno do xml. é isso que preciso, mas ele só colocou o código do botão...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele está exibindo só o ponto porque:

 

1) Os campos passados na url devem ser da forma que voce passava da outra vez senão os campos vão vazios. Acho que isso voce está fazendo não está? Apenas esqueceu de colocar aqui. Beleza então...

 

2) Agora voce deve tratar o retorno do XML.

No código do salgado, ele tratava a tag "chanel" que não existe no xml da redecard. Agora a tag que voce deverá tratar é a tag AUTHORIZATION.

Deverá ficar algo como:

set objNodeList = objXML.getElementsByTagName("AUTHORIZATION")	For Each objNode In objNodeList			html = html & objNode.firstChild.nodevalue 	next

Traduzindo acima:

- na 1a linha eu to caçando todos os elementos que são a tag AUTORIZATION (no documento da redecard só tem um). Daí estes elementos serão jogados no array objNodeList

- depois eu to percorrendo este array no laço "for each next" e to adicionando o valor de cada filho do autorization (objNode.firstChild.nodevalue) à variável html

 

Vai ficar algo mais ou menos assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aaaahh poxa! entendi como funciona isso! é que como eu tinha dito, só tinha pego coisas bem simples.

 

bem, o código ficou asim:

(...)

Else

set objNodeList = objXML.getElementsByTagName("AUTHORIZATION")

 

For Each objNode In objNodeList

For Each objNode2 In objNode.childNodes

 

Select Case objNode2.nodeName

Case "CODRET"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "MSGRET"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "NUMPEDIDO"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "DATA"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "NUMAUTOR"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "NUMCV"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "NUMAUTENT"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "NUMSQN"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

Case "ORIGEM_BIN"

html = html &"<tr><td><b>"

html = html &objNode2.firstChild.nodevalue

html = html &"</b></td></tr>"

End Select

Next

Next

(...)

 

[code=auto:0]

 

Ele tá mostrando na minha página, mas a partir do DATA ele dá erro, dizendo que o objeto "html" não existe. Daí eu queria saber se é por que no XML, quando ele mostra esse resultado, a partir do DATA, as tags estão diferentes. assim: <DATA /> .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que voce não precisará dos selects_case. Acho também que não precisará usar firstChild nos filhos, pois nem todos eles tem filhos (como o DATA)

 

Tente assim:

Dim novovalorset objNodeList = objXML.getElementsByTagName("AUTHORIZATION")For Each objNode In objNodeList  For Each objNode2 In objNode.childNodes 	novovalor = objNode2.nodeName & ": " & objNode.nodeValue	html = html & novovalor & "<br />"  NextNext

Me fala o que deu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aaah legal! mas vê, não tá mostrando os valores...

 

já coloquei a linha "novovalor = objNode2.nodeName & ": " & objNode.nodeValue" usando "" objNode2.nodeValue, mas também não mostrou nadinha.

 

ficou assim:

CODRET: MSGRET: NUMPEDIDO: DATA: NUMAUTOR: NUMCV: NUMAUTENT: NUMSQN: ORIGEM_BIN:

sem valores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, tenta então alterar esta linha:novovalor = objNode2.nodeName & ": " & objNode.nodeValueparanovovalor = objNode2.nodeName & ": " & objNode.firstChild.nodeValue

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.