Aliando web services a aplicativo j2me em Netbeans

Saudaçoes a todos

sou novo aqui no forum, comecei a estudar java este ano e estou fazendo uma aplicacao em j2me no netbeans em que a pessoa tem de “logar” pelo aplicativo, sendo q a banco de dados com os cadastrados está em um site (ou webhost), logo preciso requisitar uma web service capaz d enviar estes dados e retornar T ou F. Estou tendo dificuldade nesta parte, alguem pode me dar uma ajuda d como posso fazer? Se alguem tiver um tutorial desta area ja agradeço!

Abraços a todos!

tenho a mesma dúvida do colega…
baixei o Ksoap e o Kxml mas apresenta alguns erros.

and_ts

olá,

bom eu já passei pelo problema do and_ts sobre ksoap e kxml, porém consegui superar fazendo um exemplo básico de um web service que lista livros cadastrados e apresenta os no aplicativo j2me.

A princípio há problemas realmente em um desses projetos, então eu alterei mas não havia reportado a equipe que mantém o projeto sobre o erro! Basicamente o erro que encontrei era a respeito de classes definidas de forma errada tipo por exemplo declarado uma “interface abstrata”.

Não tenho muito domínio sobre o projeto, mas creio que tenha sido gerado com alguma ferramenta e não fora revisado o código!

Eu alterei o erro pegando o código fonte e trazendo ele pro meu projeto fazendo as devidas modificações!

Abaixo colocarei um exemplo utilizando o ksoap e kxml


import java.util.Vector;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;
import communicate.LivrosDTO;

/**
 * @author Bruno
 *
 */
public class TelaPrincipal extends MIDlet {
	private Display display;
	// url onde se encontra seu serviço instalado
                private String url = "http://localhost:8080/axis/services/LivrariaFacade";
	private TextBox textBox = null;

	protected void destroyApp(final boolean arg0) throws MIDletStateChangeException {}
	protected void pauseApp() {}

	protected final void startApp() throws MIDletStateChangeException {
		display = Display.getDisplay(this);
		try {
		       // método que gera a chamada do web service e monta as informações na tela	
                                       testWebService();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public final void testWebService() throws Exception {
	    try{
	    	StringBuffer stringBuffer = new StringBuffer();
                                // envelope soap a ser enviado na requisição ao web service
	    	SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

	    	// mapeando tipos complexos, ou seja, tipos não definidos pela JSR que define o JAX-RPC.
	    	envelope.addMapping(url, "LivrosDTO", new LivrosDTO().getClass());

	    	//criando um objeto soap e definindo qual o serviço que irá ser requisitado
	    	SoapObject soapObject = new SoapObject(url, "listaLivros");

	    	// adicionando o parâmetro ao objeto soap, pois meu serviço depende de um parâmetro
	    	soapObject.addProperty("nome", new String(""));
                                
                                // adicionando o objeto soap ao corpo do envelope
	    	envelope.bodyOut = soapObject;
	    	
                                // instanciando o objeto que faz a chamada via http, lembrando que o soap trabalha 
                                // em cima de uma arquitetura já criada ou seja protocolos que transitam na internet
	    	HttpTransport transport = new HttpTransport(url);
	    	
                                // fazendo a chamada e passando o envelope soap
                                transport.call("", envelope);
	    	
                                // com isso após a chamada o envelope é alterado e pode apresentar uma resposta
                                // como meu serviço tem como retorno um array ele foi interpretado como
                                // retorno um Vector
                                Vector response = (Vector) envelope.getResponse();

                                // a partir daqui crio um array de livros para montar uma resposta
	    	LivrosDTO[] livros = new LivrosDTO[response.size()];

	    	for (int i = 0; i < livros.length; i++){
                                                // criando um objeto soap e recuperando cada elemento da resposta
	    		SoapObject tmp = (SoapObject) response.elementAt(i);
	    		livros[i] = new LivrosDTO();
	    		
                                                // aqui deve se pegar cada propriedade/atributo de acordo com a definição
                                                // desse tipo complexo no wsdl gerado daquele web service
                                                livros[i].setAutor((String) tmp.getProperty(0));
	    		livros[i].setIsbn((String) tmp.getProperty(1));
	    		livros[i].setNome((String) tmp.getProperty(2));
	    		livros[i].setResenha((String) tmp.getProperty(3));
	    	}

                                // aqui percorro o array de livros e monto uma resposta simples
	    	for (int i = 0; i < livros.length; i++){
	    		stringBuffer.append("Nome do livro: "+livros[i].getNome()+"\n"+
	    				            "Autor: "+livros[i].getAutor()+"\n"+
	    				            "ISBN: "+livros[i].getIsbn()+"\n"+
	    				            "Resenha: "+livros[i].getResenha()+"\n\n");
	    	}

	    	// mostra o valor do resultado na tela.
	    	textBox = new TextBox("Teste WebService", stringBuffer.toString(), 1024, 0);
	    	display.setCurrent(textBox);
	    } catch(Exception e){
	    	e.printStackTrace();
	    }
	}
}

Pra chegar a esse exemplo teoricamente simples tive que percorrer muita coisa!
Mas há uma ferramenta própria do Java Wireless Toolkit que gera classes que se conectam ao web service sem você se preocupar com este problema de como se conectar!
Para se criar um web service tem um facilitador a partir do Callisto Release que gera facilmente um web service, porém como aqui se pede no Netbeans não sei qual recurso poderia ser!

Bom falei bastante sobre o caso do and_ts ou pelo menos dei uma clareada ou pelo menos tentei!

Agora sobre o marco.itba,

Bom a princípio você poderia definir um serviço denominado logar passando como parâmetro o login e senha e retorno boolean (tipo primitivo do java reconhecido pelo JAX-RPC, ou seja, não será reconhecido como tipo complexo).
Existe uma forma que seria utilizar https como conexão pra tornar mais segura a transmissão de dados porém não sei como validaria esse usuário para manter aquela sessão do usuário com o provedor de web services!

Eu desenvolvi um estudo sobre isso, pois meu projeto final de faculdade visa na criação de web services e sua utilização por aparelhos portatéis.

Qualquer dúvida é só postar ou me adicionem ao msn para esclarecer dúvidas

Até mais

Boa tarde.
Obrigado pelas explicações, mas agora meu problema é outro.
Preciso consumir um Web Service .NET. Depois de dias tentando, finalmente consegui, pesquisando muito na internet. Testei no emulador num servidor local e num aparelho Nokia conectando-se a um servidor via GPRS.
O problema é: não consigo passa parâmetros. No caso, o método “addProperty” funciona para Web Service Axis - JWS, mas não para um arquivo asmx. Já tentei muitas possíveis soluções, mas ainda não obtive sucesso.
Coincidentemente, hoje decidi que será o último dia que vou pesquisar sobre isso… =/

Obrigado.

and_ts

Boa tarde

cara porque não tenta recorrer ao Java Wireless Toolkit?

ele tem o Stub Generator que pode gerar as classes que representam ao acesso dos seus serviços desde que você tenha o wsdl do web service bem definido!

isso é uma sugestão ótima pois passei isso a poucos dias no meu projeto!

Até mais

O domínio do meu problema é simples, não acho que seja necessário. Isso pq eu já consigo me conectar a qualquer web service .NET, só não consigo passar parâmetros.
Ex:
Web Service .NET
public class Service
{

[WebMethod]
//[System.Web.Services.Protocols.SoapRpcMethod]
public int retornaSoma(int a)
{
    return a + 5;
}

}

Cliente J2ME
SoapObject client1 = new SoapObject(“http://tempuri.org”,“retornaSoma”);
client1.addProperty(“a”, new Integer(2));
HttpTransport ht1 = new HttpTransport();
ht1.setUrl(url6);
ht1.setSoapAction(“http://tempuri.org/retornaString”);
ht1.debug = true;
System.out.println((ht1.call(client1)));

Em resumo o código é esse. A linha comentada foi sugerida por diversos foruns, mas quando eu a ativo ganho um “SoapFault”

and_ts

não é: ht1.setSoapAction(“http://tempuri.org/retornaString”);

e sim: ht1.setSoapAction(“http://tempuri.org/retornaSoma”);

and_ts

Cara tenta esse código abaixo


String url = "http://tempuri.org";

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);   

SoapObject soapObject = new SoapObject(url, "retornaSoma");   
  
soapObject.addProperty("a", new Integer(2));   
                                   
envelope.bodyOut = soapObject;   
               
HttpTransport transport = new HttpTransport(url);   
               
transport.call("", envelope);   
               
System.out.println(envelope.getResponse());

Qualquer dúvida posta ae! ;D

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

Dá erro nessa linha, não tenho acesso à classe SoapSerializationEnvelope :S

Onde ela está??

and_ts

Veja ela nesse pacote ae

org.ksoap2.serialization.SoapSerializationEnvelope

Porém você deve ter o código fonte desse projeto para poder alterar alguma coisa!

Eu adaptei ao meu código.

Não tenho o pacote KSOAP2 O_O

and_ts

Você deve ter algum pacote semelhante tipo ksoap algo assim

é porque peguei uma versão mais atual do projeto!

porém continuava com o erro ae tive que fazer alterações na mão!

até

É o seguinte: eu estava utilizando uma versão mais antiga do KSOAP. Talvez seja isso. Vou baixar a mais recente pra testar mais uma vez. Por favor aguarde um retorno meu.

and_ts

Eu segui esses passos, mas deu uma exceção quando e tentei rodar a função pelo emulador, apareceu o erro ConnectionNotFoundException . Será que se eu colocar num aparelho ou num outro emulador, rodará?

Aparece justamente nesta linha aqui:

ht.call("", envelope);

Opss… Esse problema eu já resolvi, o outro é nessa mesma linha, e tá dando um NumberFormatException quando tento carregar um array. E agora? o que será? rs
abraços.

Bruno_arueira Bom dia!
Estava dando uma lida neste post e fiquei com uma duvida, gostaria de saber se
se a classe LivrosDTO faz parte da aplicação java ME e seu servlet é uma outra aplicação web?

Estou com um problema em listar dados do banco de dados e mostrar o resultado em
java ME(no display). Tenho um projeto web no qual preciso fazer operaçoes crud por meio
de um dispositivo movel.
Estou utilizando eclipse, axis2, ksoap e kxml.

Se puder me ajudar agradeço!

Olá! Do outro lado roda um servlet que deve retornar objetos do tipo LivrosDTO no método que é chamado “listaLivros” por isso foi feito o mapeamento e serialização no SOAP se eu estiver falando besteira por favor alguém me corrija. hehehehe!

                      Abraço!

Pessoal,

Faz muito tempo que foi gerada essa discussão hehe

mjava, não é propriamente um servlet é um método que é disponibilizado pelo axis… ele torna métodos de uma classe que você indica como métodos para web digamos assim e então posso comunicar com a app web :slight_smile:

E sim o meu método listaLivros na app web é justamente o tal método explicado anteriormente e me retorna um array de LivrosDTO, que eu penei para fazer funcionar… mas depois foi tranquilo e outra coisa que não consegui fazer funcionar foi passar parâmetros complexos… err… como assim? Parâmetros que não são definidos pelo JAX-RPC, pois até então você pode se comunicar com WebServices baseando-se em tipos básicos do Java que tem uma referência na especificação WSDL.

O mapeamento dessa classe LivrosDTO para retorno de um método do WebService, como dito anteriormente, consegui fazê-lo mas tipos que eu mesmo defino para passagem de parâmetros não consegui! Fiz o projeto que utilizaram essas tecnologias durante 2007 e janeiro de 2008… depois nunca mais mexi eu vou tentar retornar aos estudos nessa área de SOAP ou ir idealizando algo melhor de acordo com a tecnologia atual para terem referência para tal!

Para terem idéia até hoje recebo msg privada sobre esses assuntos de SOAP com J2ME.

Até mais e qq coisa msg privada,

Eu usei o seguinte código para testar o Ksoap2 porém ele gerou uma exception ao chamar o metodo call do HttpTransport, relatando problema no momento em q o parser é executado.

[code]private static final String SOAP_ACTION = “soma”;
private static final String METHOD_NAME = “soma”;
private static final String NAMESPACE = "http://localhost:8080/ ";
private static final String URL = “http://localhost:8080/axis/Servico.jws”;

public static void main(String[] args){



	SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

	SoapObject soapObject = new SoapObject(URL, METHOD_NAME);

	soapObject.addProperty("valor1", new Integer(2));
	soapObject.addProperty("valor4", new Integer(2));

	envelope.bodyOut = soapObject;

	HttpTransport transport = new HttpTransport(URL);

	try {
		transport.call("", envelope);
		System.out.println(envelope.getResponse());
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (XmlPullParserException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}[/code]

e a excessao gerada foi a seguinte

org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@1:0 in java.io.InputStreamReader@cdedfd) at org.kxml2.io.KXmlParser.exception(Unknown Source) at org.kxml2.io.KXmlParser.nextTag(Unknown Source) at org.ksoap2.SoapEnvelope.parse(Unknown Source) at org.ksoap2.transport.Transport.parseResponse(Unknown Source) at org.ksoap2.transport.HttpTransport.call(Unknown Source) at LocalTest.main(LocalTest.java:34)

Como posso resolver isso ? ou estou usando algo errado?

Grato