+2

Acessando webservices feitos em .NET

criado por Flávio Gonçalves Garcia em 08/03/2004 11:37am
Só pra não ficar boiando, antes de ler esse artigo, sugiro a leitura do artigo:
http://www.phpbrasil.com/articles/article.php/id/715

Depois de assimilar o cenhecimento contido no artigo do nosso colega Fábio Passos, um amigo meu perguntou-me se php acessava web services. A resposta foi curta e grossa, e com muito orgulho respondi:"É claro, e também é capaz de implementar esse serviço".

Ele ficou impressionado com a minha confiança, e me pediu para acessar um webservice gratis que ele não estava conseguindo acessar no Delphi.

Só que tinha um grande problema, o serviço foi implementado em .NET, e por mais que tentasse passar um array correto como argumento do método desejado, sempre o serviço me retornava um erro. O mais frustante, era que se seguisse a linha de raciocíno do Fábio , eu teria que passar um array de duas posições, mas o danado me retornava que só estava passando um argumento, estava faltando o segundo.

Muita calma nesta hora, vamos para o site dos caras que desenvolveram o tal de NUSOAP, para ver se eles tem um jeito de acessar a um webservice feito em .NET.

Depois de uma percorrida no site da NUSOAP, encontrei um pdf da WROX que falava como acessar um webservice .NET, na verdade, uma implementação de webservice em wsdl.

Galera essa é só a primeira página, então relaxa depois eu coloco o código.

O meu código para acessar o serviço estava assim:

<?php
//Conectando
$wcClient  = new soapclient('http://www.webservicex.com/globalweather.asmx?WSDL');
//Montando o array de argumento
//não adianta falar que o array estava errado, pq eu tentei de tudo
$msg = array('Brasilia Aeroporto','Brazil');
//Chamando o tempo
$Response = $wcClient->call('GetWeather', $msg);
?>

Trabalhando com esse código você vai ter um erro falando que está faltando o atributo do país, e depois de 2 horas seguidas disso provavelmente você sair pulando que nem o patolino por aí(uhu uhu uhu uhu), eu não fiz isso mas foi quase...

Na próxima página teremos o códogo correto, e as explicações...

Comentários:

Mostrando 1 - 10 de 19 comentários
Josué Camelo disse:
por que desse erro:


Warning: SoapClient::SoapClient() expects parameter 2 to be array, string given in C:\htdocs\teste.php on line 3

Fatal error: Uncaught SoapFault exception: [Client] SoapClient::SoapClient() [<a href='soapclient.soapclient'>soapclient.soapclient</a>]: Invalid parameters in C:\htdocs\teste.php:3 Stack trace: #0 C:\htdocs\teste.php(3): SoapClient->SoapClient('http://www.webs...&#039;, 'wsdl') #1 {main} thrown in C:\htdocs\teste.php on line 3
09/07/2009 12:04pm (~7 anos atrás)

Manda pra mim o endereço desse web service
21/03/2006 5:36am (~10 anos atrás)

Caro Flavio e amigos,

não sei se vocês viram que o Webservices do Correios é feito em .NET, tentei acessar e não consegui. Por acaso vocês conseguiram? O meu retorno foi vazio.

Juro que se der certo saio pulando como o Patolino, hauhuahua

Abraços,

Jeff
21/03/2006 4:25am (~10 anos atrás)

Flavio eu tentei o codigo que vc me mandou e não funcionou...
Obtive uma tela em branco como resposta...

No entanto tenho boas noticias:
Com ajuda do meu amigo Rogerio Pereira la dew Goiania conseguimos fazer o webservice funcionar!

eis o codigo final:

require_once('nusoap.php');
$wsdl="http://localhost/testes_webservice/Soma.wsdl";
$client = new soapclient($wsdl, true);
$param=array('Valor1'=>20 , 'Valor2'=>30);
$Response = $client->call('Soma', $param, '', '', false, true);
echo $Response;


Simples não?

Notem que acrecentei apenas o parametro true ao instanciar o objeto e usei 2 parametros em branco, um false e um true no $client->call

agora o que significam esses parametros não me perguntem pois não tenho a menor ideia...

Quando tiver tempo vou pesquisar o que significam...

Flavio, muito obrigado pelo apoio!

Espero poder compartilhar meus conhecimentos com vcs!


[ ]'s
22/02/2005 2:44pm (~11 anos atrás)

tenta isso aqui:
<?php
require_once('nusoap.php');
$wsdl="http://localhost/testes_webservice/Soma.wsdl";
//Conectando
$client = new soapclient($wsdl,'wsdl');
$param = "<soap:Body><Soma xmlns=\"http://schemas.xmlsoap.org/wsdl/\"><Valor1>20</Valor1><Valor2>30</Valor2></Soma></soap:Body>";
$Response = $client->call('Soma', $param);
echo $Response;
?>
22/02/2005 1:32pm (~11 anos atrás)

Para maior clareza do problema mando a seguir o codigo que consegui desenvolver até agora mas que infelizmente NÂO FUNCIONA!


<?php
require_once('nusoap.php');
$wsdl="http://localhost/testes_webservice/Soma.wsdl";
//Conectando
$client = new soapclient($wsdl,'wsdl');
$param = array('Valor1'=>20 , 'Valor2'=>30);
$Response = $client->call('Soma', $param);
echo $Response;
?>

No servidor.exe que foi desenvolvido em Delphi pelo pessoal aqui da empresa é onde se encontra o corpo das funções.

Neste exemplo, A função é uma simples soma do Valor1 com o Valor2.

Esse servidor gera um arquivo Soma.wsdl que contem apenas os cabeçalhos xml das funções.
Mas em nenhum momento ele diz que a resposta é Valor + Valor2...

Tambem tentei com
$param=array('ReservaService','ReservaPort','Valor1'=>20 , 'Valor2'=>30);

mas tambem não fucionou...

Acrescentando este codigo:


// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';


Obtenho o seguinte resultado:

Request
POST /testes_webservice/SophiA.wsdl HTTP/1.0
Host: localhost
User-Agent: NuSOAP/0.6.8 (1.85)
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: ""
Content-Length: 679

<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:si="http://soapinterop.org/xsd"><SOAP-ENV:Body><ns6456:Soma xmlns:ns6456="http://tempuri.org"><soapVal xsi:type="xsd:string">ReservaService</soapVal><soapVal xsi:type="xsd:string">ReservaPort</soapVal><Valor1 xsi:type="xsd:int">20</Valor1><Valor2 xsi:type="xsd:int">30</Valor2></ns6456:Soma></SOAP-ENV:Body></SOAP-ENV:Envelope>
Response
HTTP/1.1 405 Method Not Allowed
Date: Tue, 22 Feb 2005 17:51:40 GMT
Server: Apache/1.3.31 (Win32) PHP/5.0.3
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>405 Method Not Allowed</TITLE>
</HEAD><BODY>
<H1>Method Not Allowed</H1>
The requested method POST is not allowed for the URL /testes_webservice/SophiA.wsdl.<P>
<HR>
<ADDRESS>Apache/1.3.31 Server at desenv5 Port 80</ADDRESS>
</BODY></HTML>




Soma.wsdl:

<?xml version="1.0" encoding="UTF-8" ?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="ServLib"
targetNamespace="http://tempuri.org/"
xmlns:tns="http://tempuri.org/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:ro="urn:ServLib"
>

<message name="SomaRequest">
<part name="Valor1" type="xs:int" />
<part name="Valor2" type="xs:int" />
</message>
<message name="SomaResponse">
<part name="Result" type="xs:int" />
</message>

<portType name="Reserva">
<operation name="Soma">
<input message="tns:SomaRequest" />
<output message="tns:SomaResponse" />
</operation>
</portType>

<binding name="ReservaBinding" type="tns:Reserva">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="Soma">
<soap:operation soapAction="urn:ServLib-PesquisaService#Soma" style="rpc" />
<input message="SomaRequest">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ServLib-PesquisaService" />
</input>
<output message="SomaResponse">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="urn:ServLib-PesquisaService" />
</output>
</operation>
</binding>

<service name="ReservaService">
<documentation></documentation>
<port name="ReservaPort" binding="tns:ReservaBinding">
<soap:address location="http://localhost:8099/SOAP" />
</port>
</service>

</definitions>
22/02/2005 12:56pm (~11 anos atrás)

Obrigado pela força Flávio

Pelo menos agora eu tenho mais esperanças...

Só umas perguntas:

O nusoap é um bom caminho para mim?

Vou precisar de mais alguma ferramenta?

Note que no codigo asp eu tenho:

Call soapclient.mssoapinit(Server.MapPath("Nome.wsdl"),"ReservaService","ReservaPort")

Como poderia fazer algo semelhante com o php?

Obrigado novamente!





22/02/2005 9:43am (~11 anos atrás)

Cara é do mesmo jeito que eu fiz com o .net mas como a parada vai estar sendo feita direto no SOAP vc usa array como argumento em vez de ser um xml...
21/02/2005 12:04pm (~11 anos atrás)

Parabens pelo artigo, mas eu tenho uma nova missão para vcs...

É possível acessar um webservice com o servidor feito em Delphi e o cliente em PHP?

Vou especificar melhor...
Minha empresa tem um servidor feito em em Delphi e nossos sites feitos em ASP acessam facilmente esse webservice com apenas poucas linhas:

Set soapclient = Server.CreateObject("MSSOAP.SoapClient30")

Call soapclient.mssoapinit(Server.MapPath("Nome.wsdl"),"ReservaService","ReservaPort")

Com isso as paginas ASP conseguem utilizar funções que estão nesse servidor.exe (feito em delphi) bastando para isso ter o SOAP tool Kit 3.0, e o servidor.exe instalado na maquina.

Como gosto mais do PHP que do ASP, estou numa luta para tentar demonstrar que é possível fazer a mesma coisa com o PHP, mas esta dificil...

O que eu fiz até agora foi baixar o NuSoap e ja consegui rodar os exemplos que encontrei por aí...
No entanto todos usam servidores e funções feitas no propio PHP.

E se eu quiser usar as funções feitas no Delphi????


Por favor me AJUDEM!


21/02/2005 9:19am (~11 anos atrás)

Tentei implementar o mesmo script com um webservice simples que montei aqui mas não consegui sucesso na hora de receber o resultado do webservice.

Agluém poderia me dar uma ajuda?
Posso mandar meus fontes e o webservice também.

desde já agradeço atenção,

-LC
27/01/2005 1:10pm (~12 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)