WebService

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:

[code] 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>

[/code]

É 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.

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

[]´s

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!

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:

[code]<?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"?> [/code]

O código do serviço:

[code]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;
      }

}[/code]

E o código do cliente PHP:

[code]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
Erro: " . $client->faultstring;
// } else {
echo $client->return;
// }

var_dump($client);

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

TestWs();[/code]

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

[]'s

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

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

[quote=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[/quote]

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

[]´s

$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

[quote=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
[/quote]

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

[code]# @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;

}

} [/code]

Opa asaudate!

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

O erro persiste… :confused:

[]'s

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

[quote=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[/quote]

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!

[quote=fiabane][code]# @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;

}

} [/code]

Opa asaudate!

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

O erro persiste… :confused:

[]'s[/quote]

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));