+2

Acessando webservices feitos em .NET

criado por Flávio Gonçalves Garcia em 08/03/2004 11:37am
Lá vai o código:

<?php
//Funções para trabalhar com SOAP
require('../nusoap.php'); 
//Funções para trabalhar com XML, mais especificamente o xmlize, que transforma o xml indicado em array
require('../xml.functions.php');

//Endereço do webservice gratis globalweather
$wcClient  = new soapclient('http://www.webservicex.com/globalweather.asmx?WSDL','wsdl'); 

//Primeiro xml request com o nome do Brazil, poderia ser qualquer outro país
$msg = '<GetCitiesByCountry xmlns="http://www.webserviceX.NET"><CountryName>Brazil</CountryName></GetCitiesByCountry>';
//Chamando a Lista de Aeroportos
$Response = $wcClient->call('GetCitiesByCountry', array($msg));
//Tratando o erro
if ($wcClient->getError()) {
    echo '<br><br><br>ERROR<xmp>' . $wcClient->getError() . '</xmp>';
} else {
    //Transformando a resposta de xml para um array
    $xResponse = xmlize($Response);
    //Pegando o array que me interessa
    $Cidade = $xResponse["NewDataSet"]["#"]["Table"];
?>
<form name="cidade">
<center>
<table border="1" width="550">
    <tr>
        <td colspan="2" align="center"><h1>Aeroportos do Brasil</h1></td>
    </tr>
    <tr>
        <td colspan="2"><h4>Escolha o aeroporto para ver as suas condições</h4></td>
    </tr>
    <tr>
        <td colspan="2">
            <select name="nome" onchange="Pesquisa()" style="width: 100%;">
                <option value="-">-
                <?php
                    //Percorrendo as cidades
                    for ($i=0; $i < sizeof($Cidade); $i++) {
                ?>
		<option value="<?echo $Cidade[$i]["#"]["City"]["0"]["#"] . '|' . $Cidade[$i]["#"]["Country"]["0"]["#"];?>"><?echo $Cidade[$i]["#"]["City"]["0"]["#"];?>
                <?php
                    }
                ?>
            </select>
        </td>
    </tr>
	
    <!-- Descomente essa linha para exibir a requisição e a reposta do serviço GetCitiesByCountry -->
    <!--<tr>
	<td width="50%">
            <textarea style="width: 100%;" rows="8" name="cdTextArea_Request">
            <?echo 'REQUEST' . chr(13) . '<xmp>'. $wcClient->request . '</xmp>';?>
            </textarea>
        </td>
        <td width="50%"><textarea style="width: 100%;" rows="8" name="cdTextArea_Response"><?echo 'RESPONSE' . chr(13) . '<xmp>'. $wcClient->response . '</xmp>';?></textarea></td>
	</tr>-->
</table>
</form>
<?php
    //Quando for inforamado um aeroporto na url, mostraremos a informação
    if (isset($_GET["aeroporto"])&&($_GET["aeroporto"]!="-")&&($_GET["aeroporto"]!="")){
        //Quebrando a string de aeroporto
        $Xaeroporto = explode('|',$_GET["aeroporto"]);
        //Segundo xml request com o nome do Brazil, nome da cidade e depois país
        $msg = '<GetWeather xmlns="http://www.webserviceX.NET"><CityName>' . trim($Xaeroporto[0]) . '</CityName><CountryName>' . trim($Xaeroporto[1]) . '</CountryName></GetWeather>';
        //Chamando o tempo do aroporto informado
        $Response = $wcClient->call('GetWeather', array($msg)); 
        //Tratando erro
        if ($wcClient->getError()) {
            echo '<br><br><br>ERROR<xmp>' . $wcClient->getError() . '</xmp>';
        } else {
            //Transformando a resposta de xml para um array
            $xResponse = xmlize($Response);
            //Pegando o array que me interessa
            $MeuAeroporto = $xResponse["CurrentWeather"]['#'];
?>
<table border="1" width="550">
    <tr>
        <td colspan="2" align="center"><h1>Aeroporto: <?echo $Xaeroporto[0];?></h1></td>
    </tr>
    <tr>
        <td colspan="2">Localização:<?echo $MeuAeroporto["Location"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Horário:<?echo $MeuAeroporto["Time"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Condição de Vento:<?echo $MeuAeroporto["Wind"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Visibilidade:<?echo $MeuAeroporto["Visibility"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Temperatura:<?echo $MeuAeroporto["Temperature"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Ponto de Orvalho:<?echo $MeuAeroporto["DewPoint"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Umidade Relativa:<?echo $MeuAeroporto["RelativeHumidity"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Pressão:<?echo $MeuAeroporto["Pressure"]['0']['#'];?></td>
    </tr>
    <tr>
        <td colspan="2">Status:<?echo $MeuAeroporto["Status"]['0']['#'];?></td>
    </tr>
	<!-- Descomente essa linha para exibir a requisição e a reposta do serviço GetWeather -->
	<!--
    <tr>
        <td width="50%"><textarea style="width: 100%;" rows="8" name="cdTextArea_Request"><?echo 'REQUEST' . chr(13) . '<xmp>'. $wcClient->request . '</xmp>';?></textarea></td>
        <td width="50%"><textarea style="width: 100%;" rows="8" name="cdTextArea_Response"><?echo 'RESPONSE' . chr(13) . '<xmp>'. $wcClient->response . '</xmp>';?></textarea></td>
    </tr>-->
</table>
</center>
<?php
		}
	}
	
} 
?>

	
<script language="JavaScript">
function Pesquisa(){
    //Funçãozinha para mudar a url no change do select de aeroportos
    var cidade = document.cidade.nome.value;
    if (cidade!='-'){
        window.location.href = "http://viacerrado.com/webservices/getweatherclient/aeroporto_brasil.php?aeroporto=" + cidade;
    }
}
</script>

Eu coloque os seguintes arquivos um diretório acima:
nusoap.php
xml.functions.php <--esse cara tem uma função que transforma um xml em array.

Segue os links importantes para o artigo na próxima página.

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

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

Novo Comentário:

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