Problema com webservices[RESOLVIDO]

10 respostas
R

Galera,
fiz um exemplo de um cliente Java que consome um serviço .asmx.Tudo
parece funcionar bem,mas o retorno da chamada está sendo sempre
‘false’,mesmo quando deveria retornar ‘true’.Alguém sabe dizer se
estou esquecendo algo?
Segue o código:

// Endereço, local onde encontra-se o Web Service
                String local = "http://ip/sistemasweb/autenticintranet/
autenticintranet.asmx";
                // Criando e configurando o serviço
                Call call = (Call) new Service().createCall();
                call.setProperty( Call.SOAPACTION_USE_PROPERTY, new
Boolean( true ) );
                call.setProperty( Call.SOAPACTION_URI_PROPERTY, "http://intranet/
Logar");
                // Configurando o endereço.
                call.setTargetEndpointAddress(local);
                // Marcando o método a ser chamado.
                call.setOperationName("Logar");
                // Parâmetros da função Logar.
                Object[] param = new Object[] { "user","senha" };
                // Retorno da Função
                String ret = (String) call.invoke(param);
                // Imprime o resultado
                System.out.println("Resultado: " + ret);

10 Respostas

L

Rafael,

Se vc tiver gerado as classes do cliente usando o plugin do eclipse, ele te gera uma porção de classes, e vc passa a trabalhar com elas,pois elas sao o meio para invocar seu serviço, espero nao esta falando besteira, mas acho que é isso, posta as classes geradas pra eu dar uma olhada, pra ver a estrutura se ta igual aos meus aqui…

Vlw!

R

Olá Léo,não gerei essas classes,elas são mesmo necessárias?Implementei um serviço em Java e usei esse mesmo cliente e funcionou blz.

L

Olá Rafael,

se sao necessarias ou nao, nao sei te dizer ao certo,mas sempre que vou consumir um serviço, que é o seu caso ne, eu gero essas classes, pois elas sao as classes de proxy, que sao usadas para enviar uma mensagem para o servico em questao…

Agora, se vc disse que deu certo consumir um o servico, entao nao sei…

da algum erro nesse outro caso no log?

R

Leo22:
Olá Rafael,

se sao necessarias ou nao, nao sei te dizer ao certo,mas sempre que vou consumir um serviço, que é o seu caso ne, eu gero essas classes, pois elas sao as classes de proxy, que sao usadas para enviar uma mensagem para o servico em questao…

Agora, se vc disse que deu certo consumir um o servico, entao nao sei…

da algum erro nesse outro caso no log?

Não,apenas a consulta que deveria retornar ‘true’(já testei na mão) tá retornando ‘false’.

L

eu no seu lugar, geraria as classes, e passava a trabalhar com elas, ate pq evitaria de fazer isso que vc faz ai, pq as classes geradas ja fazem isso pra vc…

pq ai vc no cliente so faria algo do tipo.

AlgumaCoisaStub stub = new AlgumaCoisaStub();

// seta alguma informação de header que vc precise, nao obrigatorio.

AlgumaCoisaResult result = stub.seuServico();

return result.get_any()[0].getAsString();

e no mundo perfeito isso vai funcionar :stuck_out_tongue:

R

Usei o wsdl2Java pra gerar as classe,e tenho esse metodo logar que recebe usuário e senha e devolve um boolean

public boolean logar(java.lang.String login, java.lang.String senha) throws java.rmi.RemoteException {
        if (super.cachedEndpoint == null) {
            throw new org.apache.axis.NoEndPointException();
       }
        org.apache.axis.client.Call _call = createCall();
        _call.setOperation(_operations[0]);
        _call.setUseSOAPAction(true);
        _call.setSOAPActionURI("http://intranet/Logar");
        _call.setEncodingStyle(null);
        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
        _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP12_CONSTANTS);
        _call.setOperationName(new javax.xml.namespace.QName("http://intranet", "Logar"));

        setRequestHeaders(_call);
        setAttachments(_call);
 try {        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {login, senha});

Cliente:

public static void main(String[] args) throws RemoteException {
		try {
			AutenticIntranetSoap12Stub x = new AutenticIntranetSoap12Stub();
		    System.out.println(x.logar("usuario", "senha"));
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Mas estou recebendo esse erro:

faultDetail: 
	{http://xml.apache.org/axis/}exceptionName:org.apache.axis.NoEndPointException
	{http://xml.apache.org/axis/}stackTrace:No endpoint
	at intranet.AutenticIntranetSoap12Stub.logar(AutenticIntranetSoap12Stub.java:286)
	at intranet.Cliente.main(Cliente.java:12)

	{http://xml.apache.org/axis/}hostname:nds01

No endpoint
	at intranet.AutenticIntranetSoap12Stub.logar(AutenticIntranetSoap12Stub.java:286)
	at intranet.Cliente.main(Cliente.java:12)
R

O stub tem o construtor(URL endpoint,Service service),mas não estou entendendo como devo passar esse objeto Service.

L

verifica na tuas classes se tem uma classe "AlgumaCoisaLocator, dentro dela tem um metodo getAutenticIntranetSoap ou algo do tipo
ai vc faz:

// nao sei se ta correto o nome das classes.
AutenticIntranetSoap12Stub  stub (AutenticIntranetSoap12Stub ) = seulocator.getAutenticIntranetSoap(); 
stub.seumetodo();

se vc prestar atenção no seu codigo, vc vai ver que esse metodo getAutenticIntranetSoap() ele cria um endpoint.

Acho que é isso.

R

Resolvi aqui
foi só colocar isso no método logar:

_call.setTargetEndpointAddress("http://xxxxxxxx/sistemasweb/autenticintranet/autenticintranet.asmx");

Mas tive que comentar esse trecho:

if (super.cachedEndpoint == null) {
           throw new org.apache.axis.NoEndPointException();
        }
L

testou do jeito que falei?

Criado 7 de fevereiro de 2011
Ultima resposta 7 de fev. de 2011
Respostas 10
Participantes 2