+2

Acessando webservices feitos em .NET

criado por Flávio Gonçalves Garcia em 08/03/2004 11:37am
No pdf da WROX, estava os toques corretos para acessar o webservice.

Seque o código para acesso correto:

<?php
//Conectando
$wcClient  = new soapclient('http://www.webservicex.com/globalweather.asmx?WSDL','wsdl');
/*
Monta-se um xml com a seguinte arvore
Nome do método   +
                 |
Nome 1º atributo - <-- se tiver só um coloca só um
                 |
Nome 2º atributo - <-- se tiver mais atributos vai colocando*/

//Detalhe tem um tal de xmls que tem 
//que ser informado corretamente, se não, não funciona
$msg = '<GetWeather xmlns="http://www.webserviceX.NET"><CityName>Brasilia Aeroporto</CityName><CountryName>Brazil</CountryName></GetWeather>';
//Passa o xml como argumento
$Response = $wcClient->call('GetWeather', array($msg));
?>

Vocês devem estar se perguntando, como eu vou montar esse xml, da onde que eu tiro isso, vou ter que adivinhar!?

Não, geralmente os caras deixam o modelo da requisição necessária para o acesso ao webservice deles, curte só o modelo nesse link:

http://www.webservicex.net/globalweather.asmx?op=GetWeather

Preste atenção em como é o modelo de request para SOAP, mais especificamente no tal nó soap:Body :

<soap:Body>
    |xml a ser informado como parâmetro|
    <GetWeather xmlns="http://www.webserviceX.NET">
      <CityName>string</CityName>
      <CountryName>string</CountryName>
    </GetWeather>
    |xml a ser informado como parâmetro|
</soap:Body>

Presta atenção no tal de xmlns, o cara tem que te informar, se não dá pau!!!

Beleza, esse foi a mina experiencia, espero que eu tenha ajudado, agora eu vou colocar na próxima página o código da aplicação que eu fiz, e depois os links para todas as informações do artigo.

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 (~14 anos atrás)

Manda pra mim o endereço desse web service
21/03/2006 5:36am (~18 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 (~18 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 (~19 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 (~19 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 (~19 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 (~19 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 (~19 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 (~19 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 (~19 anos atrás)

Novo Comentário:

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