3. NameSpaces

Até agora, vimos apenas a criação e a utilização de serviços simples que desempenham tarefas muito simples. Num cenário mais global devíamos pensar na utilização de um namespace quando estamos a criar um serviço e declarar as funcionalidades que queremos expôr dentro desse namespace. Mais tarde será mais fácil integrar serviços.

Atendendo a este requisito o nosso servidor hello teria o seguinte aspeto.

Exemplo 2.8. Servidor usando NameSpaces para registar os métodos

// Register the method to expose
$server->register(
    'hello',                            // method name
    array('name' => 'xsd:string'),      // input parameters
    array('return' => 'xsd:string'),    // output parameters
    'uri:ws.di.uminho.pt/Hello',        // namespace
    'uri:ws.di.uminho.pt/Hello/hello',  // SOAPAction
    'rpc',                              // style
    'encoded'                           // use
);
...

Por sua vez, o cliente do serviço passaria a invocá-lo da seguinte forma:

Exemplo 2.9. Cliente usando NameSpaces

...
// Call the SOAP method
$result = $client->call(
    'hello',                                   // method name
    array('name' => 'José Carlos Ramalho'),    // input parameters
    'uri:ws.di.uminho.pt/Hello',               // namespace
    'uri:ws.di.uminho.pt/Hello/hello'          // SOAPAction
);
...

Este cliente gera o seguinte pedido SOAP:

Exemplo 2.10. Pedido SOAP com NameSpaces

POST /nusoap-0.9.5/Hello/serv-hello-ns.php HTTP/1.0
Host: localhost:8888
User-Agent: NuSOAP/0.9.5 (1.123)
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: "uri:ws.di.uminho.pt/Hello/hello"
Content-Length: 522

<?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/">
  <SOAP-ENV:Body>
    <ns9531:hello xmlns:ns9531="uri:ws.di.uminho.pt/Hello">
      <name xsi:type="xsd:string">José Carlos Ramalho</name>
    </ns9531:hello>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Note a utilização dos namespaces e de um elemento específico para o parâmetro na mensagem que é enviada.

A resposta a este pedido vem no formato que se mostra a seguir.

Exemplo 2.11. Resposta com NameSpaces

HTTP/1.1 200 OK
Date: Fri, 14 Dec 2012 10:45:53 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.6
X-Powered-By: PHP/5.3.6
X-SOAP-Server: NuSOAP/0.9.5 (1.123)
Content-Length: 529
Connection: close
Content-Type: text/xml; charset=ISO-8859-1

<?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/">
  <SOAP-ENV:Body>
    <ns1:helloResponse xmlns:ns1="uri:ws.di.uminho.pt/Hello">
      <return xsi:type="xsd:string">Hello, José Carlos Ramalho</return>
    </ns1:helloResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>