Durante o desenvolvimento mobile, onde sua aplicação precisa pegar dados de um server, você chega a um ponto em que é preciso acessar um web service para pegar os dados necessários.
Como fazer isso no Android?
Através da biblioteca ksoap2 -> http://code.google.com/p/ksoap2-android/
Essa biblioteca nos permite acessar o webservice, requisitar dados e recebe-los de uma maneira simples. Através do link acima, você pode baixar a API e adicionar em seu projeto.
1. Declare as String`s importantes para definir o caminho e métodos que serão usados para serem acessados pelos objetos ksoap2
private static final String METHOD_NAME = "getFoo"; private static final String NAMESPACE = "http://foo.com.br/webservice/services/FooWebService"; private static final String URL ="http://foo.com.br/webservice/services/FooWebService?wsdl";
A primeira linha é o método do web service que você vai chamar.
A segunda linha é o “nome” do caminho de onde o web service se encontra.
A terceira linha é o serviço. Um arquivo .xml WSDL. Se você é novo nessa área, de uma olhada aqui.
Depois de termos definido essas constantes, vamos agora usar o ksoap2.
2. Cria um objeto SoapObject e com os atributos NAMESPACE e METHOD_NAME
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
3. Cria um objeto Property Info para colocar o dado que será mandado para o webservice. PropertyInfo é uma propriedade de um SoapObject
PropertyInfo pi = new PropertyInfo();
4. Nome da variavel que sera passada
pi.setName(nome);
5. Valor da variavel que sera passada. Essa variavel sera enviada para o web service, e depois ele retornara o resultado
pi.setValue(parametro);
6. tipo da variavel. Pode ser qualquer Object.
pi.setType(tipo);
7. Adiciona essa propriedade no objeto request
request.addProperty(pi);
8. Cria um objecto SoapSerializationEnvelope que irá receber um objeto serializado do webservice e entregará de volta ao app
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
9. Define o objeto de retorno
Nessa linha definimos o tipo de objeto que sera retornado. Mas essa linha não é obrigatória, pois o ksoap automaticamente retorna um objeto Object
envelope.addMapping(NAMESPACE, nomeObjetoRetorno, Object.class);
10. Setta o request aqui. Pois o objeto envelope mandará esse objeto request e receberá um outro objeto.
envelope.setOutputSoapObject(request);
11. Cria o objeto que fará a conexão com o web service
AndroidHttpTransport transport = new AndroidHttpTransport(URL);
12. Objeto que receberá o resultado do envelope
KvmSerializable response = null; try { transport.call(NAMESPACE, envelope); //Conecta e envia o objeto response = (KvmSerializable)envelope.bodyIn; //recebe o resultado do web service. Um array de Objetos } catch (Exception e) { e.printStackTrace(); }
13. Cria um array de SoapObjects[] para receber os objetos do KvmSerializable response
Como eu estou esperando vários objetos do meu web service, eu vou coloca-los num array de SoapObject[]
if(response!=null){ SoapObject[] pontos = new SoapObject[response.getPropertyCount()];
14. Pega de response, passa pro SoapObject[]
Aqui mesmo você pode passar de SoapObject para o objeto que você estava esperando. Pode ser um que você tenha criado, ou uma String ou Object.
for (int i = 0; i < response.getPropertyCount(); i++) { pontos[i] = (SoapObject) response.getProperty(i); } }
Acho que preciso disso. Mas os métodos setName(), setValue(), e setType() não fazem parte ou não estão disponíveis ….
O que pode ser?
As vezes pode ser o .jar..
Você adicionou no projeto um .jar externo?
Eu recomendo usar 2.4 pra cima das versões do ksoap…
😀
muito obrigado
quando voce declara esse o comando
PropertyInfo pi = new PropertyInfo();
pi.setName(nome);
de enviar dados para webservice ele envia automaticamente ou so por meio de botao ?
Se o botao chamar o metodo ele fara isso.
O propertyinfo eh o “atributo” do objeto que vc vai buscar no webservice.
Opa tudo bem? Sou um estudante de webservices, estou criando um em Axis2 mesmo usando KSOAP2, cheguei em um momento que ao mandar a requisição ao webservice ele trava, fiz um webservice simples pra me mandar a string “HelloWorld”.
androidHttpTransport.call(NAMESPACE, envelope); e faz eu dar um force close.
Poderia me ajudar?
cara, pode ser talvez o objeto de retorno seu. Ele deve estar esperando algo e recebendo outra coisa.
tenta colocar uma String ou um Object como tipo do objeto -> propertyInfo.
Qual erro que da no logcat?
Hello, all right, man I’m with some problems, would you help me?
Sorry for my english I’m Brazilian.
Submission of WS in C #, the server sending a List of object, the more I can not read this list, as I do that, is the lord of a help?
Ola, tudo bem, cara estou com alguns problemas, teria como vc me ajuda?
Envio do WS em C#, no Servidor envio um List de object, mais nao consigo ler essa list, como que faco isso, tem como o senhor da uma ajuda?
Essa lista sera um String array. Você checou se o WS está retornando mesmo essa lista?
independente de ser uma lista ou nao, o webservice sempre retorna uma string ou um Array de Strings.
Checka seu objeto response e ve se ele está null.
abs
Cara estou com um problema…esta retornando AnyType do meu Web service sabe oq pode ser?
cara, desculpa a demora, vc conseguiu resolver?
Se ta retornando anytype, tenta fazer um cast. por exemplo. se vc ta esperando string, faz um cast com (String) e ve se consegue guardar o valor dentro de um objeto string.
😀
Cara assim, montei o ws e tudo mais, esta funcionando quase perfeitamente, apenas com um problema, que é no recebimento de um pacote de dados monstruosamente grande, com uma quantidade de dados e informações alta.
abraço.
O método é chamado no web service, porém, os valores recebidos são nulos…
Se esta vindo nulo, certeza que o web service esta retornando algo mesmo ?