Você está na página 1de 6

c   

       


Muito se fala sobre a utilização de WebServices em busca de prover a automatização de
serviços e comunicação entre sistemas. No próprio iMasters já foram disponibilizados
artigos explicando (e demonstrando) com base em exemplos, porém, é comum serem
apresentadas funcionalidades baseadas em tecnologias ³recentes´, como .NET, Java,
entre outras, mas, e se for necessário construir um exemplo a partir de uma aplicação
modo texto?

Como estudo de caso, uma empresa que possui um sistema de vendas de grande porte,
que funciona todo em modo texto com auxílio de terminais para vendas e necessita
disponibilizar um serviço que possibilite a consulta de seus produtos. Esta possui uma
equipe de desenvolvimento que presta manutenção e conhece todo o funcionamento
interno.

É necessária migração de todo o sistema para uma nova tecnologia? Realizar


treinamentos ou contratações junto à equipe de desenvolvimento?

Analisando um WebService podemos observar que este apresenta o encapsulamento de


suas funcionalidades, isto é, sabemos  ele faz mas não sabemos 
ele faz. Esse
encapsulamento é definido no WSDL do serviço, que indica quais os tipos de dados
utilizados, funcionalidades disponíveis, mas sem informar como isso é realizado
internamente.

Sendo assim, podemos utilizar a linguagem PHP como intermédio entre as


funcionalidades definidas no WSDL e as ações realizadas pelo sistema. Na realidade, o
que seria consumido é um WebService criado em PHP que realiza as ações no ³sistema´
e retorna ao cliente.

Para que o WebService realize as ações esperadas no sistema precisamos abordar alguns
quesitos:

01. Como transmitir informações sobre parâmetros para o sistema;

02. Como obter as informações geradas pelo sistema.



 
    
   


Os sistemas operacionais que trabalham com modo texto (por exemplo: Windows,
Linux), possibilitam o direcionamento da entrada e saída de informações de uma
determinada aplicação. Esse direcionamento é realizado por meio dos caracteres:

 . ³>´ : redireciona a saída para um arquivo ou outro dispositivo de saída

 . ³>>´ : redireciona a saída para um arquivo ou outro dispositivo de saída porém, se o


arquivo especificado já existir, a saída é adicionada ao final

 ³<´ : redireciona o conteúdo do arquivo como sendo a entrada padrão de dados


Como exemplo, pode se utilizar o algoritmo desenvolvido em C disponível na Listagem
1 para a geração do executável WS.EXE e a cópia do conteúdo da Listagem 2 para um
arquivo ENTRADA.TXT.

#include <stdio.h>
#include <string.h>

int main()
{
char nome[10];
/* printf(³Informe seu nome: ´); */
gets(nome);
printf("Ola %s!", nome);
return 0;
}

Listagem 1 ± Algoritmo para a geração do executável WS.EXE

Mundo

Listagem 2 ± Conteúdo do arquivo ENTRADA.TXT

Executando em modo texto o seguinte comando ³WS < ENTRADA.TXT´, teremos


como saída a frase ³Ola Mundo!´. A palavra ³Mundo´ apresentada na saída foi
informada a partir do conteúdo do arquivo ENTRADA.TXT.

Dessa forma, podemos utilizar um arquivo temporário de entrada para armazenar as


informações sobre os parâmetros, onde cada linha representa um parâmetro, e executar
o sistema direcionando a entrada a partir deste arquivo.

Analisando o exemplo acima, podemos observar que nenhuma mensagem foi


apresentada ao usuário, exceto o desejado (³Ola Mundo!´). Nessa hora entra a
importância dos programadores que prestam manutenção no sistema. Os programadores
deverão remover do código qualquer instrução que apresente molduras, rótulos, títulos e
remover os laços lógicos que ficam aguardando uma interação do usuário (Confirmar,
Cancelar, Excluir), restando apenas o código responsável por retornar as informações
desejadas. É interessante a geração desse código ³limpo´ separado do sistema principal,
isto é, em outro executável, para que este possa ser executado de maneira contínua,
retornando os resultados.

s
   
   


O ideal é que a equipe de desenvolvimento defina como serão transmitidas e retornadas


as informações. Como no caso da passagem de parâmetros, pode se retornar uma
informação por linha no retorno (Descrição, Quantidade, Preço). Mas, e se ocorreu um
erro em uma operação?

Uma vez que o código estará sendo executado de maneira contínua, é preciso saber se
tudo ocorreu bem ou não. Isto pode ser validado retornando na primeira linha se a
operação foi realizada com sucesso (e retornar possíveis resultados a mais ± Listagem 3)
ou se ocorreu alguma falha (Listagem 4).

3
Produto A
10
1.99
Produto B
50
0.50
Produto C
5
0.50

Listagem 3 ± Primeira linha retornando a quantidade de produtos encontrados e as


informações

ERRO

Listagem 4 ± Primeira linha retorna a mensagem de erro

  c   


Neste exemplo, foi utilizada a linguagem PHP como intercâmbio para o sistema, porém
nada impede que outra linguagem seja utilizada. O que será disponibilizado na verdade
é uma função que armazena os parâmetros em um arquivo temporário, execute o código
com um direcionamento de entrada recuperando as saídas e eliminando o arquivo
temporário.

Na criação do WebService foi utilizada a biblioteca NuSOAP para a criação do servidor


apresentado na Listagem 5. Também é possível a utilização de extensões SOAP da
linguagem PHP, sendo que função ³OlaMundo´ permanecerá igual, apenas alterando o
modo de criação do servidor.

<?
require_once('nusoap.php');
$s = new soap_server;
$s->register('OlaMundo');
$s->service($HTTP_RAW_POST_DATA);
exit();

function OlaMundo($Nome)
{
$arquivo = tempnam(".","tmp");

$handle = fopen($arquivo, "w+");


fwrite($handle, "$Nome");
fclose($handle);

exec('WS.EXE < '.$arquivo, $retorno);


@unlink($arquivo);

return $retorno[0];
}

?>

Listagem 5 ± Código do WebService em PHP, SistemasWS.php

Na Listagem 5, antes da execução do ³return $retorno[0];´ pode ser avaliado se a


operação foi realizada com sucesso (para exemplos mais complexos). O WSDL do
WebService é apresentado na Listagem 6 e um exemplo de cliente na Listagem 7.

<?xml version="1.0"?><?xml version="1.0"?>


<definitions name="SistemaWS" targetNamespace="urn:SistemaWS"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:SistemaWS"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-
ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="OlaMundoSoapIn">
<part name="Nome" type="xsd:string" />
</message>

<message name="OlaMundoSoapOut">
<part name="return" type="tns:string" />
</message>

<portType name="SistemaWSPort">
<operation name="OlaMundo">
<input message="tns:OlaMundoSoapIn" />
<output message="tns:OlaMundoSoapOut" />
</operation>
</portType>

<binding name="SistemaWSBinding" type="tns:SistemaWSPort">


<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="OlaMundo">
<soap:operation soapAction="urn:SistemaWS#OlaMundo" />
<input>
<soap:body use="encoded" namespace="urn:SistemaWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:SistemaWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="SistemaWS">
<documentation>Ola Mundo utilizando PHP e aplicacao Modo
Texto.</documentation>
<port name="SistemaWSPort" binding="tns:SistemaWSBinding">
<soap:address location="http://10.0.0.2:8080/~jeh/SistemaWS.php" />
</port>
</service>
</definitions>

<definitions name="SistemaWS" targetNamespace="urn:SistemaWS"


xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:SistemaWS"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-
ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="OlaMundoSoapIn">
<part name="Nome" type="xsd:string" />
</message>

<message name="OlaMundoSoapOut">
<part name="return" type="tns:string" />
</message>

<portType name="SistemaWSPort">
<operation name="OlaMundo">
<input message="tns:OlaMundoSoapIn" />
<output message="tns:OlaMundoSoapOut" />
</operation>
</portType>

<binding name="SistemaWSBinding" type="tns:SistemaWSPort">


<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="OlaMundo">
<soap:operation soapAction="urn:SistemaWS#OlaMundo" />
<input>
<soap:body use="encoded" namespace="urn:SistemaWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:SistemaWS"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>

<service name="SistemaWS">
<documentation>Ola Mundo utilizando PHP e aplicacao Modo
Texto.</documentation>
<port name="SistemaWSPort" binding="tns:SistemaWSBinding">
<soap:address location="http://10.0.0.2:8080/~jeh/SistemaWS.php" />
</port>
</service>
</definitions>

Listagem 6 ± WSDL referente ao SistemaWS.php, SistemaWS.WSDL

<?
require_once('nusoap.php');
$soapclient = new soapclient('http://10.0.0.2:8080/~jeh/SistemaWS.WSDL', 'wsdl');
?>
<html>
<?
echo $soapclient->call('OlaMundo', array( 'Nome' => 'Jeferson'));
?>
</html>

Listagem 7 ± Exemplo de cliente para o WebService, cliente.php

No exemplo, foi utilizado um código desenvolvido na linguagem C, porém, mais


linguagens podem ser utilizadas como: Clipper, Pascal, entre outras. Para cada
linguagem, o funcionamento de entrada e saída de informações deve ser avaliado pela
equipe de desenvolvimento.

(  !

php.net: http://www.php.net/

Guia Foca GNU/Linux ± Redirecionamentos e Pipe:


http://focalinux.cipsga.org.br/guia/iniciante/ch-redir.htm/

NuSOAP: http://dietrich.ganx4.com/nusoap/

Programa Olá Mundo: http://pt.wikipedia.org/wiki/Al%C3%B4_mundo/

IBM - Which Style of WSDL should I use?: http://www-


128.ibm.com/developerworks/webservices/library/ws-whichwsdl/

Você também pode gostar