Web Service em PHP


Como cada vez mais surgem novos sistemas de informação de diversas linguagens de programação, surgiram a necessidade de integração de alguns sistemas, mas como desenvolver uma ferramenta que entenda todas linguagens e que seja de fácil acesso? Foi criado o WEB SERVICE que utiliza o protocolo SOAP através do XML para enviar as informações de um sistema � outro. Anteriormente ao XML era usado comandos via “socket” que nada mais é do que um software que fica escutando uma determinada porta do computador, porém é um processo muito trabalhoso!

Abaixo temos um exemplo de um Web Service em php utilizando a classe NUSOAP. Utilizar essa classe é realmente simples!

Então vamos lá:

O primeiro exemplo é o servidor que irá enviar as informações para o cliente. O servidor agora, somente tem uma ação que é retornar um nome de usuário, na situação abaixo é “Andrey Pedro Lefkum”, mas isso pode ser dinâmico, sendo retornado do banco de dados.

Arquivo: soap.php

<?php
require_once(”nusoap.php”);

function retornaUsuarios($parametro) {
$nome = “Andrey Pedro Lefkum”;
return $nome;
}

$objetoSoapServer = new soap_server();
$objetoSoapServer->configureWSDL(’SMSSoap’,'urn:SMSSoap’);

/* Essa funcao nao faz nada */
$objetoSoapServer->register(’retornaUsuarios’
,array(’base’ => ‘xsd:string’)
,array(’return’ => ‘xsd:string’)
,’urn:SMSSoap’
,’urn:SMSSoap#retornaUsuarios’
);

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ”;

$objetoSoapServer->service($HTTP_RAW_POST_DATA);
?>

Esse segundo exemplo é a parte que faz a requisição ao servidor, nesse caso ele é o cliente.
O cliente diz qual será o servidor, e qual a função do servidor que ele quer que retorne, nesse caso é a retornaUsuarios.
Caso não aconteça nenhum erro ele retorna o nome do usuário.

Arquivo: nusoapCliente.php

<?php
require_once(”nusoap.php”);

$parametros = array(’usuarioCodigo’ => 5);

$clienteSoap = new soapclient(”http://localhost/webservice/soap.php”);
$resultado = $clienteSoap->call(’retornaUsuarios’,$parametros);

if($clienteSoap->fault) {
echo “Erro ao acessar o WEBSERVICE<br />Erro: “.$clienteSoap->faultstring;
}
else {
echo “Nome Usu疵io: “.$resultado;
}
?>

Lembrando que o cliente poderia ser feito em qualquer outra linguagem, como JAVA, ASP enfim…

Referências Bibliográficas:

Claudimir Zavalik, Gulilherme Lacerda, José Palazzo M. de Oliveira
www.inf.ufrgs.br/~palazzo/OAI/04%20Software%20Livre%20-%20Web%20Serv.pdf

Mauricio Reckziegel
http://www.imasters.com.br/artigo/4379/webservices/protocolo_de_transporte_padrao_-_soap/

Mauricio Reckziegel
http://www.imasters.com.br/artigo/4422/webservices/descrevendo_um_web_service_-_wsdl/

14 Responses to “Web Service em PHP”

  1. Alex Says:

    Olá Andrey,
    Em primeiro lugar gostaria de parabenizar pelo post.
    Estou com um problema, preciso fazer uma implementação deste webservice confome o exemplo, porém no server, minhas funções na verdade são métodos da classe. Você saberia como me dizer para registar esses métodos da classe??

    Att
    Alex

  2. Andrey Pedro Lefkum Says:

    Bom dia Alex!

    Cara, também desenvolvo orientado a objetos e encontrei esse problema, não tenho certeza mas é bem provável que terá que criar essas functions fora de classes instanciando-as dentro da forma estruturada a OO. Entendeu?

    É triste =\

    Vou dar uma pesquisada melhor!
    Até mais!

  3. Alex Says:

    Blz Andrey, fiz dessa maneira como você falou e funcionou sim. Infelizmente vai dar um trabalho a mais, mas como minhas classes já estão prontas é o único jeito.

    Abraço

    Alex

  4. Alex Says:

    Olá Andrey,
    Não estou conseguindo realizar o upload de arquivo via web service. Você sabe precisa fazer algo diferente para passar o tmp_name do arquivo para a função que estão no web service?

    Grato

  5. Andrey Pedro Lefkum Says:

    Olá alex… é seguinte o temp_name somente passará o nome do arquivo…
    para passar o arquivo vc poderá fazer o UPLOAD para o servidor, depois abrir o arquivo, pegar seu conteúdo e enviá-lo via string, depois no outro lado somente pegá-lo novamente e salvar no lugar desejado.
    blza?
    Não sei se resolve seu problema!
    qualquer coisa to ae
    abraço!

  6. Alex Says:

    Olá Andrey, encontrei outra solução para este problema. O que eu tive que fazer foi serializar o arquivo na aplicação cliente usando a função base64_encode do php. Passo isso como parâmetro para o web service e decodifico do outro lado gravando um novo arquivo com o fwrite.

    Cliente
    if($handle = fopen($filename, “r”)){
    $data = fread($handle, filesize($filename));
    $data = base64_encode($data);
    fclose($handle);
    reurn $data;
    }

    servidor
    if($handle = fopen($destino, “w”)){
    fwrite($handle,base64_decode($this->arquivo));
    fclose($handle);
    return true;
    }

    Não pude fazer da menira como você falou pq minha aplicação cliente não pode se comunicar diretamente com o servidor.

    Mas valeu pela ajuda.

    Abraço
    Alex

  7. Andrey Pedro Lefkum Says:

    Olá Alex!

    Era mais ou menos o que queria dizer, talvez não soube me expressar, utilizar o webservices para trasmitir normalmente…

    Mas usar a base 64 é ótimo, deixa como se fosse um anexo de e-mail, ou seja, com a mesma codificação base =D

    Legal
    Até mais Alex!

  8. Josy Says:

    Que arquivo é esse que ele utiliza? require_once(”nusoap.php”);

  9. Josy Says:

    Já achei a classe nusoap.. vlw

  10. Andrey Pedro Lefkum Says:

    Olá Josy!

    É a classe para utilizar e desenvolver seu WebServices.

  11. Gabriel Says:

    Alguém sabe se através da lib nunSOAP eu consigo instanciar um webservice feito em vb.bet.

    At.

    Gabriel.

  12. Bruno Braga Says:

    Olá Andrey, cara muito boa sua matéria… e estava lendo os posts deixado a você e parabenizo pelo conhecimento. Queria tirar uma dúvida e tenho certeza que pode me ajudar. Estou desenvolvendo uma aplicação para conectar com um webservice já desenvolvido em uma linguagem X que não sei dizer qual é e tb nao importa neste caso.
    Como estou começando com webservices, tenho as seguintes duvidas. A empresa em questão pede para que instanciemos um Objeto e envie esse objeto para o webservice. Como trabalho com OOP não ficou explícito e não sei se entendi mal, mas esse objeto enviado para o WS seria um Array ou uma Classe? Pois até onde ví em todas as matérias e foruns, o WS só objeto do tipo Array. Além disso, ao passar esses objetos ele já devem estar no formato xml? ou pode-se passar apenas o objeto mesmo? nao sei se minha dúvida é clara…

  13. Andrey Pedro Lefkum Says:

    Blza cara entendi sua dúvida. não tenho certeza… mas acho que não da para passar um objeto não…
    o que eu faria é utilizar o xml e deixar os elementos e atributos com valores do objeto ;)
    Blza?
    E Obrigado pelo POST!

  14. americo Says:

    Parabens pelo POST foi muito proveitoso para mim
    Obrigado pela dedicação.

Leave a Reply


This is a free Wordpress template provided by Mathew Browne | Web Design | SEO