Como pegar dados de um Web Service usando Ksoap2 library…

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);
           }
}
Anúncios

15 comentários em “Como pegar dados de um Web Service usando Ksoap2 library…

  1. 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?

  2. 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 ?

  3. 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?

    1. 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?

  4. 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?

  5. 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?

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

    1. 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.
      😀

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

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s