PROBLEMAS COM XML NO WEBSERVICE
Pessoal, tenho o seguinte método que se conecta com o webservice da empresa X:
<System.Web.Services.Protocols.SoapRpcMethodAttribute([Ô]urn:fWSCadastraDadosProdutowsdl#fWSCadastraDadosProduto[Ô], RequestNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô], ResponseNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô]), WebMethod()> _
Public Function fWSCadastraDadosProduto(<System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal pid_loja As String, ByVal plogin As String, ByVal psenha As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_produto As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_caracteristica As String, ByVal valor As String, ByRef chaves As String) As <System.Xml.Serialization.SoapElementAttribute([Ô]status[Ô])> String
Dim results() As Object = Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
chaves = CType(results(1), String)
Return CType(results(0), String)
End Function
como podem ver, ele me retorna uma String, contendo o codigo cadastrado...
todos nós sabemos que a comunicação cliente-servidor, quando se trata de webservice, é feita via XML... a questão é: há alguma forma de ao inves de retornar essa String, ele me retornar esse XML ?
<System.Web.Services.Protocols.SoapRpcMethodAttribute([Ô]urn:fWSCadastraDadosProdutowsdl#fWSCadastraDadosProduto[Ô], RequestNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô], ResponseNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô]), WebMethod()> _
Public Function fWSCadastraDadosProduto(<System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal pid_loja As String, ByVal plogin As String, ByVal psenha As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_produto As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_caracteristica As String, ByVal valor As String, ByRef chaves As String) As <System.Xml.Serialization.SoapElementAttribute([Ô]status[Ô])> String
Dim results() As Object = Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
chaves = CType(results(1), String)
Return CType(results(0), String)
End Function
como podem ver, ele me retorna uma String, contendo o codigo cadastrado...
todos nós sabemos que a comunicação cliente-servidor, quando se trata de webservice, é feita via XML... a questão é: há alguma forma de ao inves de retornar essa String, ele me retornar esse XML ?
Posta ae o endereço do webservice...
http://loja.tray.com.br/webservice/ws_servidor.php?wsdl
Não costumo fazer isso, mas fiz um exemplo de como se deve consumir um webservice corretamente(em VB.NET)
Quanto à sua pergunta, funciona assim: Vc trabalha com o retorno do método, esse método([Ô]fWSCadastraDadosProduto[Ô]) retorna string, até é possÃvel serializar como XML, teria que ver o que o método traz...
Quanto à sua pergunta, funciona assim: Vc trabalha com o retorno do método, esse método([Ô]fWSCadastraDadosProduto[Ô]) retorna string, até é possÃvel serializar como XML, teria que ver o que o método traz...
como assim, o que o método traz ? onde vejo isso ?
nessa string q ele retorna, ele me traz o codigo do registro q foi cadastrado...
eu tentei serializar o retorno dele, nesse método:
Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(Object()))
Dim writer As System.IO.TextWriter = New System.IO.StreamWriter([Ô]objeto.xml[Ô], False)
serializer.Serialize(writer, Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
writer.Close()
( o INVOKE, me retorna um Object() )
e o xml q ele retornou foi esse:
<?xml version=[Ô]1.0[Ô] encoding=[Ô]utf-8[Ô] ?>
<ArrayOfAnyType xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xmlns:xsd=[Ô]http://www.w3.org/2001/XMLSchema[Ô]>
<anyType xsi:type=[Ô]xsd:string[Ô]>ok</anyType>
<anyType xsi:type=[Ô]xsd:string[Ô]>3|1291</anyType>
</ArrayOfAnyType>
mas acredito q nao seja esse o xml que vem do webservice, pois nao tem nada nele falando de wsdl e tal...
nessa string q ele retorna, ele me traz o codigo do registro q foi cadastrado...
eu tentei serializar o retorno dele, nesse método:
Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(Object()))
Dim writer As System.IO.TextWriter = New System.IO.StreamWriter([Ô]objeto.xml[Ô], False)
serializer.Serialize(writer, Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
writer.Close()
( o INVOKE, me retorna um Object() )
e o xml q ele retornou foi esse:
<?xml version=[Ô]1.0[Ô] encoding=[Ô]utf-8[Ô] ?>
<ArrayOfAnyType xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xmlns:xsd=[Ô]http://www.w3.org/2001/XMLSchema[Ô]>
<anyType xsi:type=[Ô]xsd:string[Ô]>ok</anyType>
<anyType xsi:type=[Ô]xsd:string[Ô]>3|1291</anyType>
</ArrayOfAnyType>
mas acredito q nao seja esse o xml que vem do webservice, pois nao tem nada nele falando de wsdl e tal...
Veja no [Ô]exemplo[Ô] que te passei, na linha
retorno = servico.fWSCadastraProduto([Ô]loj........
se vc passar o mouse sobre o método [Ô]fWSCadastraProduto[Ô], vai ver que aparecem ali todos os parâmetros e no final [Ô]As String[Ô], ou seja, isso é o retorno do método... depois de executar essa linha de comando, veja o que a variável [Ô]retorno[Ô] contém, isso é o retorno do método, ou seja, o que o método te traz...
retorno = servico.fWSCadastraProduto([Ô]loj........
se vc passar o mouse sobre o método [Ô]fWSCadastraProduto[Ô], vai ver que aparecem ali todos os parâmetros e no final [Ô]As String[Ô], ou seja, isso é o retorno do método... depois de executar essa linha de comando, veja o que a variável [Ô]retorno[Ô] contém, isso é o retorno do método, ou seja, o que o método te traz...
Citação:( o INVOKE, me retorna um Object() )
Obviamente. Do modo como vc está fazendo, vc está invocando o método sem usar a referência, ou seja, está usando um método [Ô]genérico[Ô] para executar o método. Pelo simples fato do [Ô]Invoke[Ô] ser um modo genérico de se fazer isso, o retorno dele SEMPRE é [Ô]Object[Ô], justamente por não estar consumindo o método diretamente, ele não sabe o que pode vir, por isso, o retorno tem que ser também genérico.
mas há algum outro método q eu possa substituir o Invoke ? q nao seja generico...
No exemplo que te passei, eu faço JUSTAMENTE ISSO, consumir o webmethod diretamente.
mas fera, vc ainda continua usando o Invoke, e aparentemente do teu codigo pro meu, mudou nada...
Mudou sim, usando o Invoke direto, o retorno é sempre object e vc tem que usar um cast para pegar o retorno. Do modo que eu fiz, eu pego o retorno direto em uma variável string.
Tópico encerrado , respostas não são mais permitidas