WebService

12 respostas
F

Olá pessoal!

Primeiro, gostaria de pedir desculpas, caso o assunto não seja referente a esse tópico...

Segundo, estou desenvolvendo um webService simples no netbeans. Boa parte do código ele gera, bem como o wsdl. Bom, até ai tudo bem...O netbeans também gera e copia o wsdl para WEB-INF/wsdl, junto com um esquema...e ai que estou com problemas.

O cenário é o seguinte:
Tenho um webService que tem como entrada um string e concatena com outra e mostra isso na tela. Estou fazendo testes com uma app em PHP pra consumir esse serviço. A app enxerga o webService, lista o único método, porém quando passa a string pro webService é como se tivesse passado null, pois fica: Nome escolhido: null.

código do webService:

1. @WebService(wsdlLocation="WEB-INF/wsdl/WsNomeService.wsdl")  
   2. public class WsNome {  
   3.   
   4.     /** 
   5.      * Operação de serviço web 
   6.      */  
   7.     @WebMethod(operationName = "sNome")  
   8.     public String sNome(@WebParam(name = "nome") String nome) {  
   9.         //TODO write your implementation code here:  
  10.         String retorno = new String();  
  11.   
  12.         retorno = "Nome escolhido:" + nome;  
  13.   
  14.         return retorno;  
  15.     }  
  16.   
  17. }

eu vi que no wsdl em vez dele colocar no message ele coloca e define esse sNome, no esquema, como sendo um tipo complexo (e dessa estrutura ele define o parâmetro de entrada)

wsdl:
...

1. <message name="sNome">  
   2.     <part name="parameters" element="tns:sNome"/>  
   3.   </message>

....

schema:

...

1. <xs:element name="sNome" type="tns:sNome"/>  
   2.     
   3.   
   4.   <xs:element name="sNomeResponse" type="tns:sNomeResponse"/>  
   5.     
   6.   
   7.   <xs:complexType name="sNome">  
   8.     <xs:sequence>  
   9.       <xs:element name="nome" type="xs:string" minOccurs="0" maxOccurs="1"/>  
  10.     </xs:sequence>  
  11.   </xs:complexType>
...

É isso pessoal, se puderem me dar uma força...estou empacado nessa parte. Como não havia trabalhado com webServices estou levando um laço nisso e penso que a solução deva ser algo simples só não estou vendo

Att.

12 Respostas

Alexandre_Saudate

Teste o serviço com o SOAP UI. Assim, você consegue ver, exatamente, qual a entrada que ele espera.

[]´s

F

Obrigado pela força amigo, mas teria como explicar melhor?

Esse SOAP UI é um plugin pro netbeans?lib para o php?

Em java eu consigo consumir o serviço…Fiz testes com uma outra app em Java e tranquilo, o problema é fazer o php consumir o serviço.

Abraço!

F

Olá asaudate!

Testamos com o SOAP UI e ele não identificou o retorno (pelo menos eu acho que não).

Assim:

Esse é o esquema e o wsdl do serviço:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://geral.webservice.unipampa.br/" xmlns:tns="http://geral.webservice.unipampa.br/" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="sayHello" type="tns:sayHello"/>

  <xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>

  <xs:complexType name="sayHello">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="sayHelloResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.1-hudson-28-. -->
<definitions targetNamespace="http://geral.webservice.unipampa.br/" name="WsNameService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:tns="http://geral.webservice.unipampa.br/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://geral.webservice.unipampa.br/" schemaLocation="WsNameService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="sayHello">
    <part name="parameters" element="tns:sayHello"/>
  </message>
  <message name="sayHelloResponse">
    <part name="parameters" element="tns:sayHelloResponse"/>
  </message>
  <portType name="WsName">
    <operation name="sayHello">
      <input wsam:Action="http://geral.webservice.unipampa.br/WsName/sayHelloRequest" message="tns:sayHello"/>
      <output wsam:Action="http://geral.webservice.unipampa.br/WsName/sayHelloResponse" message="tns:sayHelloResponse"/>
    </operation>
  </portType>
  <binding name="WsNamePortBinding" type="tns:WsName">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="sayHello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="WsNameService">
    <port name="WsNamePort" binding="tns:WsNamePortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

O código do serviço:

package br.unipampa.webservice.geral;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 *
 * @author alexanderrego
 */
@WebService()
public class WsName {

    /**
     * Operação de serviço web
     */
    @WebMethod(operationName = "sayHello")
    public String sayHello(@WebParam(name = "name") String name) {
        //TODO write your implementation code here:
        return "Olá "+ name;
    }

}

E o código do cliente PHP:

function TestWs() {

    $Ws = 'http://localhost:8080/WsNome/WsNameService?WSDL';

    $WSDL = new SoapClient($Ws);
    $nome[0] = 'askdhakjsdh';
    $nome[1] = 'askdhaasdkjsdh';


    $client = $WSDL->__getTypes();
    $client = $WSDL->__getLastResponse();
    $client = $WSDL->__getFunctions();



    "<br/>" . var_dump($client) . "<br/>";
//        sayHello = 'asdasda';

    $client = $WSDL->__soapCall('sayHello', array('name' => "teste"));

//    if ($client->fault) {
//        echo "Erro ao acessar o WEBSERVICE<br />Erro: " . $client->faultstring;
//    } else {
        echo $client->return;
//    }

    var_dump($client);


//        var_dump($Ws->__getFunctions());
//
//        $X = $Ws->sayHello('SerJunior');
//        echo $retorno->return;
}

TestWs();

Se puder, ou se puderem me dar uma luz... mesmo passando o parâmetro o retorno sempre é null. Ex.: "Olá null"

[]'s

Alexandre_Saudate

O que você quer dizer com “não identificou retorno”? Não retornou uma resposta ou ele não conseguiu mandar a requisição?

[]´s

F

Opa…

Erro de expressão…

Ele não reconhece o parâmetro de entrada…O retorno vem normal, tanto é que sai a string “Olá null”.

Fiz vários tutoriais e todos tem o mesmo padrão de wsdl. :confused:

[]`s

Alexandre_Saudate

fiabane:
Opa…

Erro de expressão…

Ele não reconhece o parâmetro de entrada…O retorno vem normal, tanto é que sai a string “Olá null”.

Fiz vários tutoriais e todos tem o mesmo padrão de wsdl. :confused:

[]`s

Qual a requisição que você está mandando?

[]´s

F
$client = $WSDL->__soapCall('sayHello', array('name' => "teste"));

estou enviando a string teste…Teoricamente era pra sair “Olá teste”…Mas sai “Olá null” (echo $client->return;)

[]`s

Alexandre_Saudate

fiabane:
$client = $WSDL->__soapCall('sayHello', array('name' => "teste"));

estou enviando a string teste…Teoricamente era pra sair “Olá teste”…Mas sai “Olá null” (echo $client->return;)

[]`s

Na linha onde você define o “name”, na verdade, na sua classe está mapeado como nome. Note a assinatura:

# @WebMethod(operationName = "sNome")    
#   8.     public String sNome(@WebParam(name = "nome") String nome) {

Altere sua chamada para

$client = $WSDL->__soapCall('sayHello', array('nome' => "teste"));

Depois poste aqui o resultado, OK?

[]´s

F
# @WebService()  
# public class WsName {  
#   
#     /** 
#      * Operação de serviço web 
#      */  
#     @WebMethod(operationName = "sayHello")  
#     public String sayHello(@WebParam(name = "name") String name) {  
#         //TODO write your implementation code here:  
#         return "Olá "+ name;  
#     }  
#   
# }

Opa asaudate!

Eu troquei essa parte no serviço, então a chamada é
$client = $WSDL->__soapCall('sayHello', array('name' => "teste"));
mesmo.

O erro persiste... :/

[]'s

F

opa asaudate!

Tchê resolvi parte do problema…agora o esquema tá ali na declaração do parâmetro.

Quando uso o ‘int’, tipo primitivo eu declaro o parâmetro @WebParam(name = “i”) e no PHP passo array(‘i’ => ‘2’) e beleza.

Agora se eu coloco ex.: public String hello(@WebParam(name = “nome”) String nome), no PHP chamo __call->hello(array(‘nome’ => ‘Teste’)) e ele dá null…não reconhece o parâmetro ‘nome’. Se eu não coloco o @WebParam(name = “nome”) e no PHP coloco __call->hello(array(‘arg0’ => ‘Teste’)) ele funciona o.0

Ainda não entendi isso…no SOAP UI ele reconhece tudo…só no PHP que dá problema na situação que eu descrevi ai em cima.

[]'s

Alexandre_Saudate

fiabane:
opa asaudate!

Tchê resolvi parte do problema…agora o esquema tá ali na declaração do parâmetro.

Quando uso o ‘int’, tipo primitivo eu declaro o parâmetro @WebParam(name = “i”) e no PHP passo array(‘i’ => ‘2’) e beleza.

Agora se eu coloco ex.: public String hello(@WebParam(name = “nome”) String nome), no PHP chamo __call->hello(array(‘nome’ => ‘Teste’)) e ele dá null…não reconhece o parâmetro ‘nome’. Se eu não coloco o @WebParam(name = “nome”) e no PHP coloco __call->hello(array(‘arg0’ => ‘Teste’)) ele funciona o.0

Ainda não entendi isso…no SOAP UI ele reconhece tudo…só no PHP que dá problema na situação que eu descrevi ai em cima.

[]'s

Putz… aí, já é uma questão que não sei resolver (não conheço nada de PHP).

Se o SOAP UI reconhece, e funciona com arg0, não sei onde mais você pode tentar… =/

Lamento!

saulomendonca
fiabane:
# @WebService()  
# public class WsName {  
#   
#     /** 
#      * Operação de serviço web 
#      */  
#     @WebMethod(operationName = "sayHello")  
#     public String sayHello(@WebParam(name = "name") String name) {  
#         //TODO write your implementation code here:  
#         return "Olá "+ name;  
#     }  
#   
# }

Opa asaudate!

Eu troquei essa parte no serviço, então a chamada é
$client = $WSDL->__soapCall('sayHello', array('name' => "teste"));
mesmo.

O erro persiste... :/

[]'s

Para resolver o problema o parâmetro tem q ficar dentro de outro array
Ex.:
$param = array('name' => "SauLo");
$client = $WSDL->__soapCall('sayHello', array($param));

Criado 19 de janeiro de 2011
Ultima resposta 17 de jun. de 2011
Respostas 12
Participantes 3