Consumir Web Services

11 respostas
B

Pessoal, estudei e procurei por muitas informações neste e em outros fóruns, sobre Web Services, porém ocorre o seguinte.
Quero consumir o web service dos correios, cujo endereço é(http://www.bronzebusiness.com.br/webservices/wscep.asmx). Já conseguir isso em PHP, utilizando a biblioteca NuSOAP, ela simplesmente monta a mensagem SOAP, e retorna o resultado num array com os caracteres, e é super fácil de tratar.

Porém, estou tendo muitas dificuldade para consumir esse serviço em java, até por nunca ter feito isso.
Pelo que li, eu devo ter o AXIS no meu projeto. coloquei o AXIS.

Mas não sei como deve fazer essa requisição e como os dados são retornados pra mim. Se é em um array, como no PHP, ou em objeto (o mais provável), por se tratar de Java.

o código q peguei e coloquei, me retornou um SOAP fault, além de erros no AXIS…

ENTÂO, gostaria primeiramente que alguém me explicasse como funciona uma requisição em AXIS, feita a um web service externo, como o dos correios, desta forma terei uma base melhor pra fazer perguntas mais técnicas.

VLW pessoal

11 Respostas

A

O ideal seria vc usar o eclipse para gerar o cliente do webservice…
Na verdade o webservice tem seus métodos e quando vc gera o cliente ele te gera uma interface onde vc pode chamar esses métodos remotos e os retornos, que podem ser objetos com atributos ou valores comuns(Integer, String, etc)

o ideal é vc conseguir gerar o cliente com o eclipse e o axis para utilizar este webservice
pq nao tem erro, depois é so vc chamá-lo que ele te retorna um objeto(criado pelo wizard)… o código fica mais ou menos assim:

MeuService s = new MeuServiceLocator().getMeuService();
s.meuServico();

B

Legal cara, comecei a entender...
Então não é apenas chamar o Web Service que já está pronto...
primeiro devo criar um cliente, que no meu entendimento, é uma interface do Web Service já criado, para que o AXIS "entenda" os dados.... algo incorreto neste meu entendimento?

e como eu criaria este cliente? pq eu vi num artigo que ensinava a criar um cliente, e este cliente, parece q tem a função de se conectar no web service e dar a resposta, e não, criar uma interface do web service.

segue o código:

import org.apache.axis.client.Service;
import org.apache.axis.client.Call;

public class Correios {
	public static void main(String[] args) throws Exception {
		StrCEP strcep = new StrCEP();
		strcep.setStrcep("05816010");
		
		// Endereço, local onde encontra-se o Web Service
		String local = "http://www.bronzebusiness.com.br/webservices/wscep.asmx";
		// Criando e configurando o serviço
		Call call = (Call) new Service().createCall();
		// Configurando o endereço.
		call.setTargetEndpointAddress(local);
		// Marcando o método a ser chamado.
		call.setOperationName("cep");
		// Parâmetros da função soma.
		Object[] param = new Object[] { strcep.getStrcep() };
		// Retorno da Função
		String ret = (String) call.invoke(param);
		// Imprime o resultado: ret = 2 + 4.
		System.out.println("Resultado da soma : " + ret);
	}
}

Será q estou no caminho certo?

G

bourne:
Dê uma olhada no artigo: http://wso2.org/library/1719.

É um tutorial bem simples e bastante eficiente.

Boa sorte!

Qualquer dúvida é só falar.

Att.,
Gustavo Veloso.

A

bourne:
Legal cara, comecei a entender…
Então não é apenas chamar o Web Service que já está pronto…
primeiro devo criar um cliente, que no meu entendimento, é uma interface do Web Service já criado, para que o AXIS “entenda” os dados… algo incorreto neste meu entendimento?

a idéia vc pegou sim, mas vc nao vai codificar nada assim
o eclipse gera tudo pra vc… basta vc incluir o suporte ao axis no seu projeto (isso eh meio automatico quando vc chama o wizard)
no eclipse, tente dar um ctrl+ N
webservices -> new webservice client

lá vc coloca o endereço do webservice e ele deve te guiar nos passos seguintes

A

Você pode simplesmente fazer uma requisição http para o webservice usando o httpclient mais ou menos assim:
onde soapAction é a acao que vc está chamando do webservice e request é o xml da requisicao.

HttpClient client = new HttpClient();

HttpMethod method = new PostMethod(URL);

Header he = new Header(“SOAPAction”, soapAction);

method.addRequestHeader(he);

method.setDoAuthentication(true);
((PostMethod) method).setRequestBody(request);

            try {
                    client.executeMethod(method);
                    String responseBody = method.getResponseBodyAsString();
                    return responseBody;
            } catch (Exception e) {
                    throw new Exception("It was not possible to connect to server. Exception: " + e);
            } finally {
                    method.releaseConnection();
            }
B

dohko:

a idéia vc pegou sim, mas vc nao vai codificar nada assim
o eclipse gera tudo pra vc… basta vc incluir o suporte ao axis no seu projeto (isso eh meio automatico quando vc chama o wizard)
no eclipse, tente dar um ctrl+ N
webservices -> new webservice client

lá vc coloca o endereço do webservice e ele deve te guiar nos passos seguintes

dohko, fiz isso… daí o eclipse pede o service definition, e eu coloquei o endereço do WSDL…
antes de clicar em finish, tinha um warning referente ao WSDL q informei, que dizia:
“No Server has been selected. The Web Service client will not be deployed, installed, or run”
Msm assim eu dei um finish…

Daí foram geradas um monte de classes:
CepResponseCepResult.java
DataSet.java
Wscep.java
WscepLocator.java
WscepSoap.java
WscepSoapStub.java
WscepSoapProxy.java
WscepSoap12Stub.java

devo então criar uma classe com o main() pra chamar esse client, certo?
mas qual classe devo instanciar, qual método executar, qual atributo obtenho a resposta?

A

acho que é

x = new WscepLocator().getWscep();
x.seuMetodo

é uma coisa assim
veja os metodos disponiveis na classe wsceplocator

B

dohko,

pelo que vi essa classe WscepLocator extende um Service e implementa uma interface de Wscep (interface tb gerada pelo eclipse)…

Esse WscepLocator me parece descrever qual é o serviço, pois tem um atributo com o endPoint definido e tdo mais…
nela eu num tenho opção de dar um getWscep(), eu posso dar um get no endpoint, no nome do serviço e tal

mas WscepLocator tem um método createCall, até pq extende a classe service, mas não sei o que fazer, dps de dar um createCall

continuo na caminhada…

A

cara, infelizmente eu realmente nao lembro…
tentei pegar meu note onde tinha um projeto velho e nao tem cliente
tbm to sem eclipse aqui
se alguem aqui do forum puder dar um help…

ms enquanto isso…tente localizar uma classe que tem o metodo getNomedoSeuServico
nao tem erro cara eh soh vc instanciar um objeto chamando o get do seu servico e em seguida chamar o seu metodo
tem poucas classes possiveis…

malz ae

B

blz dohko,

realmente estou tentando fzr de tdo pra conseguir isso,
mas está difícil rs

eu acho q o eclipse gerou errado, até por causa daquele warning que eu citei acima

brigado cara, e se alguém souber me dar um help, eu agradeço
senão, vou continuar lendo e testando

abraços e qq coisa eu posto aqui

A

cara....estou em casa aqui...testando o seu webservice

gerei os clients para o endereço
http://www.bronzebusiness.com.br/webservices/wscep.asmx?WSDL

o eclipse gerou todas as classes ok, sem dar erros

o código ficou assim

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import org.apache.axis.message.MessageElement;
import org.tempuri.CepResponseCepResult;
import org.tempuri.WscepLocator;
import org.tempuri.WscepSoap;


public class Teste {
	
	public static void main(String[] args) throws ServiceException, RemoteException {
		
		
		WscepSoap meuWS = new WscepLocator().getwscepSoap12();
		CepResponseCepResult result = meuWS.cep("86300000");
		
		
		MessageElement[] me = result.get_any();
		
		for(int i = 0; i < me.length; i++) {
			System.out.println(me);
		}
		
	}

}

só que tem um detalhe
o cara fez um lance bem especifico pra dotnet
realmente nao sei como ler estes dados

vc vai ter que dar um jeito de "desserializar" este retorno do webservice
ou então pegar uma classe pronta de alguem que já fez integração com dotnet

Criado 12 de janeiro de 2009
Ultima resposta 13 de jan. de 2009
Respostas 11
Participantes 4