Mini Curso Web Services com PHP

Post on 30-Nov-2014

26.566 views 7 download

description

 

Transcript of Mini Curso Web Services com PHP

Minicurso Minicurso Web Services com PHP Web Services com PHP

Vinícius Costa de Souzaviniciuscs@unisinos.br

http://www.inf.unisinos.br/~vinicius

julho de 2005

2

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Nome

Conhecimentos sobre Web Services

Conhecimentos sobre PHP

Expectativas referentes ao curso

ApresentaçõesApresentações

3

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

ProgramaPrograma

Introdução

Web Services O que são? Arquitetura Tecnologias

XML WSDL SOAP UDDI

Web Services com PHP

XML-RPC NuSOAP PEAR SOAP REST PHP Extension

4

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Por que surgiram os Web Services ?

Reutilização

Disponibilidade

Interoperabilidade

3.300 projetos em 2002

15,2 milhões de dólares até 2007

IntroduçãoIntrodução

5

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

WebWeb ServicesServices

Web Services são componentes de software que

independem de implementação ou de plataforma e

podem ser descritos, publicados e invocados sobre

uma rede através de mensagens padrão XML.

O que são?O que são?

6

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web ServicesWeb Services

interagir

publicarencontrar

Solicitante de

Serviços

Provedor de

Serviços

Registro de

Serviços

cliente

serviço

Descrição do serviço

Descrição do

serviço

ArquiteturaArquitetura

7

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web ServicesWeb ServicesTecnologiasTecnologias

8

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias

No contexto de Web Services, a XML não é apenas utilizada como formato para troca de mensagens, mas também como a forma através da qual os serviços são definidos

Permite superar as limitações do HTML

Possibilita criar qualquer número de elementos (tags) com significado associado às informações

XMLXML

9

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias

Através de XML esquemas é possível validar as informações separadamente e descrever os atributos e características dos dados

Duas partes só podem trocar informações em XML e entender os elementos da mesma forma se compartilharem uma mesma definição sobre quais e como os elementos podem ser utilizados

XMLXML

10

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias A WSDL é a linguagem padrão XML utilizada para descrever interfaces de Web Services

A WSDL é dividida em três elementos principais:

definições de tipo de dados - determinam a estrutura e o conteúdo das mensagens.

operações abstratas - determinam as operações possíveis

protocolos de ligação - determinam as formas de transmissão das mensagens pela rede até os destinatários

WSDLWSDL

11

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologiasWSDLWSDL Camadas de descrição dos serviços

12

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias O SOAP é um protocolo para troca de informações em ambiente descentralizado e distribuído que permite comunicação entre aplicações de forma simples e completamente independente de sistema operacional, linguagem de programação ou plataforma

A comunicação é realizada através de trocas de mensagens, transmitidas em formato XML, incluindo os parâmetros usados na chamada, bem como os dados de resultados.

Também pode ser utilizado para invocar, publicar e localizar Web Services no registro UDDI

SOAPSOAP

13

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias

O SOAP pode ser utilizado em combinação com uma variedade de outros protocolos, como HTTP, SMTP, FTP, dentre outros. Também suporta Remote Procedure Call

O modelo de dados SOAP oferece definições para tipos de dados como string, integer, float, double e date

SOAPSOAP

14

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias Um pacote SOAP possui as seguintes partes:

Envelope: define o início e o fim das mensagens, quem poderá tratá-las e se o tratamento é obrigatório ou opcional

Cabeçalho: contém atributos opcionais das mensagens

Corpo: contém os dados em XML

Anexo: consiste de um ou mais documentos anexados a mensagem principal

RPC: define como o modelo RPC (Remote Procedure call) interage com o SOAP, com o objetivo de invocar procedimentos em um sistema remoto.

Codificação: define como representar dados simples e complexos a serem transmitidos nas mensagens

SOAPSOAP

15

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias Envelope, Cabeçalho e Corpo das mensagens SOAP

SOAPSOAP

16

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias Invocação do serviço utilizando SOAP

SOAPSOAP

17

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias

Para que um serviço seja utilizado é necessário que o cliente consiga localizá-lo, e esta localização pode ser feita através do UDDI, que é uma especificação técnica para descrever, descobrir e integrar Web Services

Para isso, existe um registro global público, chamado UDDI business registry, no qual toda a informação está disponível para consultas em geral. Entretanto, um registro privado pode adicionar controle de segurança para proteger os dados e prevenir acessos não autorizados

UDDIUDDI

18

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

TecnologiasTecnologias

UDDI utilizado para descobrir um Web Service

UDDIUDDI

19

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

XML-RPC

NuSOAP

PEAR SOAP

REST

SOAP Extension

PossibilidadesPossibilidades

20

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

Remote Procedure Calls – RPC são utilizadas para estabelecer e facilitar transações entre dois sistemas remotos

XML-RPC é uma implementação de RPC que possibilita o transporte de dados em XML entre dois servidores utilizando o protocolo HTTP

XML-RPC tollkit disponível em: http://sourceforge.net/projects/phpxmlrpc

Versão 1.1.1 de 30/06/2005

XML-RPCXML-RPC

21

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

Classes

xmlrpc_client – clientes

xmlrpc_server - servidores

xmlrpcmsg – requisições ao servidor

xmlrpcresp – respostas do servidor

xmlrpcval – encapsula valores para XML-RPC

Arquivos

xmlrpc.inc

xmlrpcs.inc

XML-RPCXML-RPC

22

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

xmlrpc_server.php

<?php include ("xmlrpc.inc"); include ("xmlrpcs.inc"); function CalculaICMS ($objeto){

$valor = $objeto->GetParam(0); $valor_escalar = $valor->scalarval(); $valorICMS = $valor_escalar * 1.5; return new xmlrpcresp (new xmlrpcval($valorICMS, "string"));

} $servidor = new xmlrpc_server (array("valorICMS.CalculaICMS"=>array("function"=>"CalculaICMS")));?>

XML-RPCXML-RPC

23

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

xmlrpc_client.php<?php

include ("xmlrpc.inc");$valor_nf = "15.000";

$format = new xmlrpcmsg('valorICMS.CalculaICMS', array(new xmlrpcval($valor_nf, "double")));

$client = new xmlrpc_client("xmlrpc_server.php", "localhost", 80);$request = $client->send($format);$resp = $request->value();

echo $value->scalarval();?>

XML-RPCXML-RPC

24

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPExercíciosExercícios

1. Baixar as classes XML-RPC http://sourceforge.com

3. Baixar os exemplos xmlrpc_server.php e xmlrpc_client.php em www.inf.unisinos.br/~vinicius e testar. Simular alguns erros com e sem a opção de debug.

5. Criar um Web Service que recebe um nome (string) e retorna como resposta a frase “Olá nome!”.

25

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

PHP Extension and Application Repository

http://pear.php.net

Repositório de classes em PHP

Licença livre

Grande comunidade

PEAR SOAP Client/Server for PHP

implementação do protocolo SOAP e serviços

versão 0.9.1 Beta de 31/05/2005.

PEARPEAR

26

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPPEARPEARpear-server1.php <?php

require_once 'SOAP/Server.php'; $server = new SOAP_Server; class SOAP_Example_Server { var $method_namespace = 'urn:SOAP_Example_Server'; function echoString($inputString) { return $inputString; } } $soapclass = new SOAP_Example_Server(); $server->addObjectMap($soapclass); $server->service($HTTP_RAW_POST_DATA);

?>

27

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPPEARPEAR

pear-client1.php <?php

require_once 'SOAP/Client.php'; $soapclient = new SOAP_Client('http://localhost/pear-server1.php'); $result = $soapclient->call('echoStringSimple', array('inputString' => 'this is a test string'), array('namespace' => 'urn:SOAP_Example_Server');

?>

28

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

API desenvolvida em PHP

Permite a criação de clientes e servidores

Possui suporte embutido a WSDL.

Instalação simplificada

servidor Web com suporte a PHP

biblioteca de classes nusoap.php

http://sourceforge.ner/projects/nusoap

A última versão estável é a 0.7.0 de 3/6/2005

NuSOAPNuSOAP

29

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

nusoap_server1.php<?php // inclusão do arquivo de classes NuSOAP require_once('nusoap.php'); // criação de uma instância do servidor $server = new soap_server; // registro do método $server->register('hello'); // definição do método como uma função do PHP function hello($name) { return 'Hello '.$name;

}// requisição para uso do serviço$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';

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

NuSOAP NuSOAP (exemplo 1 – Hello World)

30

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

nusoap_client1.php<?php // inclusão do arquivo de classes NuSOAP require_once('nusoap.php');

// criação de uma instância do cliente $client = new soapclient('http://localhost/server1.php');

// chamada do método SOAP $result = $client->call('hello',array('V SDSL'));

// exibe o resultado print_r($result);?>

NuSOAP NuSOAP (exemplo 1 – Hello World)

31

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

nusoap_client2.php<?php

require_once('nusoap.php');

$client = new soapclient('http://localhost/server1.php');

// verifica se ocorreu erro na criação do objeto $err = $client->getError(); if ($err){ echo "<h2>Erro no construtor</h2><pre>".$err."</pre>"; } // chamada do método SOAP $result = $client->call('hello',array('V SDSL'));

// verifica se ocorreu falha na chamada do métodoif ($client->fault){

echo "<h2>Falha</h2><pre>"; print_r($result); echo "</pre>";

NuSOAP NuSOAP (exemplo 2 - debug)

32

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

}else{ // verifica se ocorreu erro na execução do método $err = $client->getError(); if ($err){ echo "<h2>Erro</h2><pre>".$err."</pre>"; }else{ // exibe o resultado echo "<h2>Result</h2><pre>".print_r($result)."</pre>";

} }

// exibe a requisição e a respostaecho '<h2>Requisição</h2>';echo '<pre>'.htmlspecialchars($client->request).'</pre>';echo '<h2>Resposta</h2>';echo '<pre>'.htmlspecialchars($client->response).'</pre>';

// Exibe mensagens para debug

echo '<h2>Debug</h2>';echo '<pre>'.htmlspecialchars($client->debug_str).'</pre>';

?>

NuSOAP NuSOAP (exemplo 2 - debug)

33

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

RequisiçãoPOST server1.php HTTP/1.0User-Agent: NuSOAP/0.6.7 (1.75)Host: localhostContent-Type: text/xml; charset=ISO-8859-1SOAPAction: ""Authorization: Basic dmluaWNpdXM6dW5pc2lub3M=Content-Length: 538

<?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> <ns1:hello xmlns:ns1="http://testuri.org"> <soapVal xsi:type="xsd:string">III SDSL</soapVal> </ns1:hello> </SOAP-ENV:Body></SOAP-ENV:Envelope>

NuSOAP NuSOAP (exemplo 2 - debug)

34

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

server2.php<?php

require_once('nusoap.php');$server = new soap_server;

// inicializa o suporte a WSDL $server->configureWSDL('server2','urn:server2');

$server->wsdl->schemaTargetNamespace = 'urn:server2'; // registra o método a ser oferecido $server->register('hello', //nome do método array('name' => 'xsd:string'), //parâmetros de entrada array('return' => 'xsd:string'), //parâmetros de saída 'urn:server2', //namespace 'urn:server2#hello', //soapaction 'rpc', //style 'encoded', //use 'Says hello to the caller' //documentação do WS ); ...

NuSOAP NuSOAP (exemplo 3 - WSDL)

35

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

36

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

1. Baixar as classes do NuSOAP http://sourceforge.net

Baixar e testar os três exemplos apresentados http://www.inf.unisinos.br/~vinicius

2. Alterar o nusoap-server2.php para que o mesmo forneça um novo serviço além do hello. Este novo serviço deve ser chamado de Media e deve receber como parâmetros de entrada dois números reais (num1 e num2) e retornar como saída um parâmetro (resultado), que deve ser o resultado do cálculo da média entre os dois números.

3. Criar um cliente para acessar o novo serviço implementado

ExercíciosExercícios

37

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

1. Criar um cliente para acessar um Web Service disponibilizado pela Amazon.com através da API NuSOAP

O web service disponibilizado pela Amazon (http://soap.amazon.com) permite a realização de consultas em sua base de dados. Dessa forma, podemos incluir fomulários para pesquisas na Amazon em nossos próprios sites.

ExercíciosExercícios

38

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

1. URL para acesso ao serviço da Amazon.comhttp://soap.amazon.com/schemas3/AmazonWebServices.wsdl

2. Parâmetros a serem passados 'keyword' => $palavra,

'page' => $pagina, 'mode' => 'books', 'tag' => 'melonfire-20', 'sort' => '+pmrank', 'type' => 'lite', 'devtag' => 'YOUR-TOKEN-HERE‘

3. Nome do método a ser chamado KeywordSearchRequest

4. Retorno$result['Details'];$result['TotalResults'];

DicasDicas

5. Array Details 'Url‘ 'ImageUrlSmall' 'ProductName‘ 'Authors‘ 'OurPrice'

39

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

O REST difere bastante do SOAP e do XML-RPC.

não é um padrão

não existem classes pré-construídas

não exige nenhuma extensão especial ou biblioteca de classes

O protocolo HTTP faz o envio e recebimento de mensagens padrão XML.

uso de métodos padrão HTTP como o GET, POST e PUT para enviar e recuperar dados XML.

Necessário utilizar ferramentas como PHP DOM, SAX, ou também XSL para fazer o parsing.

Web Services com PHPWeb Services com PHPRESTREST

40

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPRESTREST

rest-server.php <?php // obtém o valor do parâmetro passado. $amount = $_GET["amount"]; // efetua o cálculo do imposto

$taxcalc = $amount*0.15; // monta o XML de resposta echo "<?xml version=\"1.0\"?>";

echo "<taxinfo>"; echo "<result>".$taxcalc."</result>"; echo "</taxinfo>";

?>

41

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPRESTRESTrest-client.php <?php $rs = "http://localhost/rest-server.php"; $qs = ""; $param = array('amount' => "15.00"); foreach($param as $key=>$value){ $qs = $qs."$key=".urlencode($value)."&"; } $url = "$rs?$qs"; $xml = file_get_contents($url); echo $xml; ?>

42

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

A extensão SOAP do PHP 5 é a primeira implementação do protocolo SOAP para PHP em C

Possui algumas vantagens em relação a outras implementações escritas em PHP, sendo a principal delas a velocidade.

Essa extensão, ainda definida como experimental, pode ser utilizada para implementar servidores e clientes SOAP com suporte a SOAP 1.1, SOAP 1.2 e WSDL 1.1.

Possui uma série de funções pré-definidas

Web Services com PHPWeb Services com PHPSOAP ExtensionSOAP Extension

43

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPSOAP ExtensionSOAP Extension

soap-server1.php <?php

//criação de uma instância do servidor $server = new SoapServer(null, array('uri' => "http://localhost/ws/")); //definição do serviço function helloWorld($name) { return "Hello ".$name; } //registro do serviço $server->addFunction("helloWorld"); //chamada do método para atender as requisição do serviço $server->handle();

?>

44

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHPSOAP ExtensionSOAP Extension

soap-client1.php <?php // criação de uma instância do cliente $client = new SoapClient(null, array(

'location' => 'http://localhost/ws/soap-server1.php', 'uri' => 'http://localhost/ws/', 'trace' => 1);

// chamada do serviço SOAP $result = $client->helloWorld('Vinícius'); // verifica erros na execução do serviço e exibe o resultado if (is_soap_fault($result)){

trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faulstring})", E_ERROR);

}else{ print_r($result); } ?>

45

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

Web Services com PHPWeb Services com PHP

1. Implementar e testar o exemplo

ExercícioExercício

46

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

ReferênciasReferências

http://www.w3.org/2002/ws/ W3C - Web Services Activity

http://sourceforge.net/projects/nusoap/ NuSOAP project page

http://www.xmlrpc.com Site oficial do XML-RPC

http://pear.php.net/package/SOAP SOAP Package

http://br.php.net/manual/pt_BR/ref.soap.phpSite oficial do PHP

http://www.w3.org/TR/soap/SOAP

http://www.w3.org/TR/wsdlWSDL 

http://www.w3.org/XML/XML 

http://www.uddi.org/ UDDI

47

Web Services com PHP

Vinícius Costa de Souza - Julho de 2005 /

OBRIGADO!OBRIGADO!

Vinícius Costa de Souzaviniciuscs@unisinos.br

www.inf.unsinos.br/~vinicius

São Leopoldo, julho de 2005