Portal Android - Comunidade de Desenvolvedores Android
http://www.portalandroid.org/comunidade/

[TUTORIAL] Consumir Webservices com tipo complexos
http://www.portalandroid.org/comunidade/viewtopic.php?f=119&t=11094
Página 1 de 1

Autor:  Valter Fernandes [ 14 Jun 2011, 11:40 ]
Assunto do Tópico:  [TUTORIAL] Consumir Webservices com tipo complexos

Consumir Webservices com tipo complexos

Devido a dificuldade e falta de documentação, resolvi publicar um artigo falando sobre como consumir webservices enviando tipos complexos.
Depois de muitos testes e perguntas para o sr. Google, consegui chegar a um resultado satisfatório. Enviar um tipo complexo para um webservice não é tão simples e exige um pouco de trabalho.

Vou expor uma forma de utilizar tipos complexos no Android utilizando o biblioteca Ksoap2 na versão 2.5.4.
download em: http://code.google.com/p/ksoap2-android ... encies.jar

Grande parte deste artigo foi inspirado neste link (em inglês): http://seesharpgears.blogspot.com/2010/ ... -with.html
Créditos para o SeeSharpWriter que respondeu à algumas perguntas minhas.

Vamos lá:
Dessa forma, segundo pesquisei em alguns lugares, não é possível enviar um array de objetos(Não testei pra confirmar). Apenas arrays de tipos primitivos: String, int, booleam, etc...
Na versão 2.5.5 me parece possível enviar um array de objetos complexos. Isso caberá para um próximo artigo.
Obs: nunca utilize Vector ou List para trabalhar com webservices no android pois não vai funcionar.


Assinatura do metodo do webservice

public User Logar(User usuario){
   return usuario;
}
 


Eis o envelope SOAP1.1

Envio

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Logar xmlns="http://tempuri.org/">
      <Authentication>
        <Username>string</Username>
        <Password>string</Password>
      </Authentication>
    </Logar>
  </soap:Body>
</soap:Envelope>
 



Retorno

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <LogarResponse xmlns="http://tempuri.org/">
      <LogarResult>
        <Username>string</Username>
        <Password>string</Password>
      </LogarResult>
    </ LogarResponse >
  </soap:Body>
</soap:Envelope>
 


Explicando: o webservice recebe um objeto do tipo User que possue Username e Password como atributos String.

Vamos a classe User
Essa classe precisa implementar a interface KvmSerializable da biblioteca ksoap2. Essa interface nos obriga a implementar 4 métodos: getProperty, getPropertyCount, getPropertyInfo e setProperty.

Classe User


public class User implements KvmSerializable{

    public String Username;
    public String Password;
   
    public User(){};
   
    public User(String user, String pass) {
        this.Username = user;
        this.Password = pass;
    }

    //Este metodo é como se fosse um “get especial”
    //Você passa o índice da propriedade que você quer buscar
    @Override
    public Object getProperty(int arg0) {
        switch(arg0) {
        case 0:
            return Username;
        case 1:
            return Password;
        }
       
        return null;
    }

    //Este método retorna a quantidade de propriedades que a classe
    //possui
    @Override
    public int getPropertyCount() {
        return 2;
    }

    //Este metodo define as informações das propriedades para o
    //ksoap. Nunca precisei utilizar este método. Mas o ksoap
    //precisa dele para definir o tipo complexo
    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        switch(index) {
        case 0:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "Username";
            break;
        case 1:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "Password";
            break;
        default: break;
        }              
    }

    //Este metodo é como se fosse um “set especial”
    //você passa o índice da propriedade e o valor
    @Override
    public void setProperty(int index, Object value) {
        switch(index) {
        case 0:
            Username = value.toString();
            break;
        case 1:
            Password = value.toString();
            break;
        default:
            break;
        }      
    }

    //método toString para exibir os dados na tela
    public String toString(){
        return “Username: ” + Username “\n”
            + “Password: ” + Password;
    }   
}
 



Metodo logarWebService.
Este método é chamado pelo evento onclick de um botão.


public void logarWebService(View view) throws Exception{
    public String URL ="enderecoWebService";
    public String NAME_SPACE = "nameSpaceWebService";
        public String METODO = "Metodo do webService";
    public String ACTION = "http://nameSpace/metodo";

        String result = "";
    EditText txtNome = (EditText)findViewById(R.id.txtUserName);
    EditText txtPassword = (EditText)findViewById(R.id.txtPassword);
       
    String nome = txtNome.getText().toString();
    String senha = txtPassword.getText().toString();
   
    //instanciando e definindo as propriedades da classe
    //USer
    User usuario = new User();
    usuario.Username = nome;
    usuario.Password = senha;   
    //criando o request para enviar ao webservice
        SoapObject request = new SoapObject(NAME_SPACE, METODO);
    //setando o objeto "usuario" como uma propriedade
    PropertyInfo pi = new PropertyInfo();      
    //este nome deve estar igual ao do envelope SOAP
        pi.setName("Authentication");
    pi.setValue(Authentication);
    pi.setType(Authentication.getClass());
        request.addProperty(pi);
        //montando o envelope Soap
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    //o webservice é em .Net
    //se fosse em Java nao teria necessidade desta linha
        envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    //mapeando o objeto para o retorno envelope
    //Esta linha se faz necessária para você
    //conseguir pegar o retorno do webservice
    //O webservice retorna o mesmo objeto
    //que você enviou
    envelope.addMapping(NAME_SPACE,User.class.getSimpleName(),
            User.class);

    //criando o transporte do envelope
    HttpTransportSE transport = new HttpTransportSE(URL);      
       
    try {
        //chamando o webservice
        transport.call(ACTION, envelope);
        //pegando o retorno
        SoapObject response ==(SoapObject)envelope.getResponse();
        User userRetorno = new User();
        userRetorno.Username = response.getProperty(0).toString();
        userRetorno.Password = response.getProperty(1).toString();

             result = userRetorno.toString();                  
         } catch (Exception e) {
          result = e.getMessage() + "FALHOU";
          e.printStackTrace();
         }
       

    //exibindo o resultado na tela         
    TextView txt = (TextView)findViewById(R.id.texto);
    txt.setText(result);
}
 



O webservice retorna o mesmo usuario que voce passou como parametro pra ele.
Bom pessoal, é isso ai. Este foi o meu primeiro tutorial e espero que ajude o pessoal.
Dúvidas ou erros, por favor me avisem.
Este código está funcionando normalmente aqui. Não se esqueçam de trocar a URL, METODO, etc... para os do seu WebService.

Vlw galera.

Autor:  edmaraaf [ 15 Jun 2011, 11:47 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Parabéns pelo post Valter!!

Muito bom... e será bem aproveitado...

Valter, eu sou iniciante em android e tb em java... como eu poderia tratar o retorno de uma lista, por exemplo um List<MPais>, MPais teria os atributos ID e Nome?
Por gentileza é possível vc me passar um exemplo?

Desde já agradeço...

Autor:  Valter Fernandes [ 15 Jun 2011, 16:34 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

E ai Edmar, tudo joia?

Bom, vamos lá.

Primeiramente, até onde sei, os webservices não trabalham com List, mas sim com arrays. Então, seu webservice deve retornar um MPais[] e nao um List<MPais>. Se o webservice for em .Net, quando você retorna um List, ele ja faz a conversão pra você.

Ainda não testei esse código, mas provavelmente irá funcionar.
Foi retirado do blog http://seesharpgears.blogspot.com


public static MPais[] transformarEmArray(SoapObject soap)
    {
        MPais[] mpais = new MPais[soap.getPropertyCount()];
        for (int i = 0; i < categories.length; i++) {
            SoapObject obj= (SoapObject)soap.getProperty(i);
            MPais item = new MPais();
            item.ID= Integer.parseInt(obj.getProperty(0).toString());
            item.Nome= obj.getProperty(1).toString();
            mpais[i] = item;
        }
        return categories;
    }
 


Espero que ajude.
Abraço

Autor:  dvdfranco [ 15 Jun 2011, 18:37 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

opa, muito legal esse tutorial!

Se eu estiver só em desenvolvimento, com o celular na minha wifi, o android vai conseguir acessar o Webservice que está no IIS da maquina de desenvolvimento (192.168.0.1) ?

Autor:  thicow [ 16 Jun 2011, 11:11 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Com certeza. Se teu cel estiver na rede wifi que seja a mesma rede do 192.168.0.1, ele acessa normal!

Autor:  Valter Fernandes [ 16 Jun 2011, 11:44 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Na teoria sim. Ainda não testei no aparelho pois não tenho um. Aqui na rede local onde estou, está funcionando normalmente. O webservice está em outra máquina.
Você precisa dar permissão de acesso a internet no AndroidManifest.xml para acesso a internet e acesso ao wireless


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 

Autor:  rprado [ 18 Ago 2011, 13:40 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Muito bom este exemplo,

Mas encontrei um problema...
Como enviar uma lista de objetos para um webservice???

Tentei desta forma, o objeto chega no webservice, mas a lista está vasia.

Para matear a lista no java, coloquei a lista como Vector<objeto>
se eu colocar outro modelo de lista, da um erro onde não consegue serializar o objeto.

Alguem sabe alguma forma???


Valew

Autor:  Valter Fernandes [ 19 Ago 2011, 10:29 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

rprado, tudo joia?

A partir da versao 2.5.5 do Ksoap2, você pode utilizar o método "addSoapObject".

Segue um exemplo tirado do link http://code.google.com/p/ksoap2-android ... sAndTricks

Exemplo de xml:

<users>
  <user>
     <name>Jonh</name>
     <age>12</age>
  </user>
  <user>
     <name>Marie</name>
     <age>27</age>
  </user>
</users>


Exemplo de codigo java:
SoapObject users = new SoapObject(NAMESPACE, "users");
SoapObject john = new SoapObject(NAMESPACE, "user");
john.addProperty("name", "john");
john.addProperty("age", 12);
SoapObject marie = new SoapObject(NAMESPACE, "user");
john.addProperty("name", "marie");
john.addProperty("age", 27);
users.addSoapObject(john);
users.addSoapObject(marie);




Lembrando que o seu medoto do webservice deve estar esperando um ARRAY e não um List

Se tiver algum progresso, poste ai pro pessoal.

Abraço

Download do Ksoap 2.5.5
http://code.google.com/p/ksoap2-android ... encies.jar

Autor:  rprado [ 19 Ago 2011, 22:55 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Opa valew,

Consegui fazer deste jeito msm.

Valew

Autor:  Alexmatrix [ 30 Out 2011, 12:51 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Bom dia. Pessoal por favor me ajudem a resolver esse problema. Peço encarericamente! Alguem realmente consegiu receber um array de objetos usando ksoap2? Ja faz uma semana que tento encontrar uma solução e não obtenho sucesso. Ja não sei mais o que fazer =[[[[[[

ja consigo receber primitivos, mas array de objetos não consigo. Por exemplo, preciso receber uma lista de clientes, onde não posição [0] do array tenha um cliente (com nome, idade, etc) e na posição [1] tenha outro cliente (com nome, idade, etc) e assim sucessivamente.
Mas sempre retorna uma Exception.

Autor:  Valter Fernandes [ 23 Nov 2011, 09:32 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Alex, me desculpe a demora, mas você conseguiu resolver seu problema? Qual a exception que está ocorrendo? Seu webservice é em .net ou em java? Abraço

Autor:  EduardoSga [ 10 Abr 2012, 13:19 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Valter Fernandes

O senhor pode me ajuda?

Mando uma string para o WS, ele me retorna uma list de Clientes no formato xml


<Cliente>
<Codigo> </Codigo>
<Nome> </Nome>
<Endereco> </Endereco>
</Cliente>
<Cliente>
<Codigo> </Codigo>
<Nome> </Nome>
<Endereco> </Endereco>
</Cliente>
 


Mais no androide não consigo ler essa list de objetos, acusa a exception org.ksoap2.serialization.SoapObject,

Teria como o senhor me da uma ajuda nesse assunto?

Autor:  Valter Fernandes [ 10 Abr 2012, 14:40 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

EduardoSga, tudo bem?
Por favor hein... vc me chamou de velho dizendo senhor... rsrs

Brincadeira...

Bom, é o seguinte:

Sem o seu codigo fica dificil te ajudar. Poste seu codigo ai...

Abraços

Autor:  Rotiv [ 15 Mai 2012, 18:45 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Valter Fernandes.

Achei excelente seu tutorial acredito q vai ajudar mta gente inclusive eu...rs

Eu nao estou conseguindo consumir um web service de tipo complexo feito em .net.

Consegui fazer com um tipo primitivo, mas nao consegui consumir uma lista de objetos, estou a mais o menos uma semana pesquisando e nada, pode me dar uma força com um exemplo.?

Tenho q recuperar uma lista de Aluno q tem nome, sobrenome, idade.

por ser um teste ainda, nao preciso passar parametro nenhum para esse serviço.

Mto Obrigado.

Autor:  Normando [ 20 Mai 2012, 00:01 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Rotiv, você conseguiu solucionar sua dúvida? qual teu e-mail para contato?

estou para consumir no android uma array contendo 3 dados em cada objeto. O webservice é em .NET. Você conseguiu utilizando a api do ksoap2?

Abraço

Autor:  Normando [ 20 Mai 2012, 00:04 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Opa Rotiv, você conseguiu consumir uma array de objetos com a biblioteca do ksoap2?

Tenho que consumir de um webservice .Net, uma lista de objetos com 4 atributos cada.

Autor:  Valter Fernandes [ 06 Jul 2012, 18:28 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Pessoal

Desculpe a demora ai.

Seguinte, tem uma forma muito mais fácil e pratica para enviar objetos complexos via webservice com o KSoap mesmo. Porém, só funciona com o Ksoap a partir da versao 2.5.5.

é mais ou menos assim:

// montando o objeto do request
        SoapObject objReq = new SoapObject("NAME_SPACE", "request");

        SoapObject clienteComplexType = new SoapObject("NAME_SPACE", "cliente");
       
        clienteComplexType .addProperty("idCliente", 1);
        clienteComplexType .addProperty("nomeCliente", "Carlos");
        clienteComplexType .addProperty("idadeCliente", 10);
       

        // adicionando o objeto ao request
        request.addSoapObject(clienteComplexType);


Se o objeto cliente tivesse um objeto Endereco, ficaria assim


// montando o objeto do request
        SoapObject objReq = new SoapObject("NAME_SPACE", "request");

        SoapObject clienteComplexType = new SoapObject("NAME_SPACE", "cliente");
       
        objReq.addProperty("idCliente", 1);
        objReq.addProperty("nomeCliente", "Carlos");
        objReq.addProperty("idadeCliente", 10);
       
        SoapObject enderecoComplexType = new SoapObject("NAME_SPACE", "endereco");
       
        enderecoComplexType.addProperty("rua", "Rua Alberto Roberto");
        enderecoComplexType.addProperty("numero", "10");
        enderecoComplexType.addProperty("bairro", "Centro");
       
        clienteComplexType.addSoapObject(enderecoComplexType);
       
        // adicionando o objeto ao request
        request.addSoapObject(clienteComplexType);
 


Acho que já dá pra ter uma noção legal... Com isso, você já consegue enviar objetos complexos e até mesmo arrays de objetos.


Qualquer dúvida estamos ai.

Autor:  caneto [ 06 Ago 2012, 12:09 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Oi bom Dia,

Não sei se pode me ajudar, eu consegui consumir usando o ksoap para o retorno com 1 registro

Citação:
08-01 15:41:07.683: V/ParseBogXML(658): anyType{NewDataSet=anyType{RetornaUF=anyType{COD_UF=12; NOM_UF=Acre; SIGLA_UF=AC; }; }; }


Mais quando vem mais de um não consegui, ja tentei varias formas e nada.

Citação:
08-01 15:41:07.683: V/ParseBogXML(658): anyType{NewDataSet=anyType{RetornaUF=anyType{COD_UF=12; NOM_UF=Acre; SIGLA_UF=AC; }; RetornaUF=anyType{COD_UF=27; NOM_UF=Alagoas; SIGLA_UF=AL; }; RetornaUF=anyType{COD_UF=16; NOM_UF=Amapá; SIGLA_UF=AP; }; RetornaUF=anyType{COD_UF=13; NOM_UF=Amazonas; SIGLA_UF=AM; }; RetornaUF=anyType{COD_UF=29; NOM_UF=Bahia; SIGLA_UF=BA; }; RetornaUF=anyType{COD_UF=23; NOM_UF=Ceará; SIGLA_UF=CE; }; RetornaUF=anyType{COD_UF=53; NOM_UF=Distrito Federal; SIGLA_UF=DF; }; RetornaUF=anyType{COD_UF=32; NOM_UF=Espírito Santo; SIGLA_UF=ES; }; RetornaUF=anyType{COD_UF=52; NOM_UF=Goiás; SIGLA_UF=GO; }; RetornaUF=anyType{COD_UF=21; NOM_UF=Maranhão; SIGLA_UF=MA; }; RetornaUF=anyType{COD_UF=51; NOM_UF=Mato Grosso; SIGLA_UF=MT; }; RetornaUF=anyType{COD_UF=50; NOM_UF=Mato Grosso do Sul; SIGLA_UF=MS; }; RetornaUF=anyType{COD_UF=31; NOM_UF=Minas Gerais; SIGLA_UF=MG; }; RetornaUF=anyType{COD_UF=15; NOM_UF=Pará; SIGLA_UF=PA; }; RetornaUF=anyType{COD_UF=25; NOM_UF=Paraíba; SIGLA_UF=PB; }; RetornaUF=anyType{COD_UF=41; NOM_UF=Paraná; SIGLA_UF=PR; }; RetornaUF=anyType{COD_UF=26; NOM_UF=Pernambuco; SIGLA_UF=PE; }; RetornaUF=anyType{COD_UF=22; NOM_UF=Piauí; SIGLA_UF=PI; }; RetornaUF=anyType{COD_UF=33; NOM_UF=Rio de Janeiro; SIGLA_UF=RJ; }; RetornaUF=anyType{COD_UF=24; NOM_UF=Rio Grande do Norte; SIGLA_UF=RN; }; RetornaUF=anyType{COD_UF=43; NOM_UF=Rio Grande do Sul; SIGLA_UF=RS; }; RetornaUF=anyType{COD_UF=11; NOM_UF=Rondônia; SIGLA_UF=RO; }; RetornaUF=anyType{COD_UF=14; NOM_UF=Roraima; SIGLA_UF=RR; }; RetornaUF=anyType{COD_UF=42; NOM_UF=Santa Catarina; SIGLA_UF=SC; }; RetornaUF=anyType{COD_UF=35; NOM_UF=São Paulo; SIGLA_UF=SP; }; RetornaUF=anyType{COD_UF=28; NOM_UF=Sergipe; SIGLA_UF=SE; }; RetornaUF=anyType{COD_UF=17; NOM_UF=Tocantins; SIGLA_UF=TO; }; }; }


Agradeço qualquer ajuda.
Pois estou parado no projeto, so dependendo disso.

Autor:  Jaini [ 09 Jan 2013, 20:08 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Oi Antunes.

Otimo seu tutorial. Bem claro, ainda mais pra uma pessoa que está iniciando agora com programação android.

Eu preciso saber se você tem um exemplo de como pegar um arquivo e enviar para o webservice.
Sei que tem que converter em array bytes... mas nao encontrei um exemplo claro pra me ajudar...
Me confundo depois em como inseri-lo no addproperty...
Eu tentei isso mas não deu certo. No meu web service também não estou sabendo configurar, lembrando que o ws é em java.. e a maioria dos artidos e tutoriais são voltados mais para o .net.



....
File arq = new File( "C:/ARQUIVO.pdf" );
byte[] b = this.getBytes(arq);

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

request.addProperty("arq", b);
...



Estou pesquisando faz dias já. Mas infelizmente nao consigo sair disso. Pode me dar uma ajuda por favor ?

Muito obrigada

Autor:  AugustoFavretto [ 04 Jan 2015, 23:43 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Primeiramente Parabens pelo post você pode me ajudar?
Como faço para enviar um array<Obejct> de um cliente moblie para um webservice?

Para enviar um objeto eu estou conseguindo.
Tenho a seguinte situação preciso enviar um objeto com esses campos:

 
public int ClienteID;
public String Nome;
public String Status;
public String Enviado;
public Vector<InformacoesAdd> Info;
 


Para enviar objetos eu consigo tranquilo porem ao adicionar o campo ArrayList estou com problemas na serialização o que devo fazer alguem tem alguma dica?

Ex: Enviar para um servidor:

Cliente c = new Cliente(1,"Augusto","Visita Concluida","Pendente");
c.AddInfo(new InformacoesAdd(1,"Teste 1","Teste de Descrição 1"));
c.AddInfo(new InformacoesAdd(2,"Teste 2","Teste de Descrição 2"));
c.AddInfo(new InformacoesAdd(3,"Teste 3","Teste de Descrição 3"));
c.AddInfo(new InformacoesAdd(4,"Teste 4","Teste de Descrição 4"));
 


obs: Já implementei a classe AddInfo ao KvmSerializable.

Autor:  Nuno_Melo [ 13 Nov 2019, 12:10 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

bom dia valter fernandes
poderia me ajudar aqui no envio de um objeto para um webservice
o webservice recebe este tipo de objeto

<soap:Body>
<Teste xmlns="http://tempuri.org/">
<obj>
<Nome>string</Nome>
<Idade>int</Idade>
</obj>
</Teste>
</soap:Body>

este e o meu codigo para enviar o objeto para o webservice
public String sendPoastSoap(){

System.setProperty("http.keepAlive", "false");
SoapObject request = new SoapObject("http://tempuri.org/", "Teste");



Teste obj = new Teste();
obj.Nome ="melo";
obj.Idade = 40;
PropertyInfo po = new PropertyInfo();
po.setName("obj");
po.setValue(obj);
po.setType(obj.getClass());
request.addProperty(po);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;


HttpTransportSE httpTransport = new HttpTransportSE("Aqui tenho colocado o meu webservcie");
httpTransport.debug = true;

String result = null;

try {
httpTransport.call("http://tempuri.org/Teste", envelope); //metodo recebe soap action e o metodo "http://tempuri.org/ObterDadosContentor"
} catch (HttpResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}

try {
Object results = envelope.getResponse();
result = results.toString();
//params = (String[]) envelope.getResponse();

String x = null;


} catch (SoapFault e) {
e.printStackTrace();
}

return result;

}

/////////////////////////////////////////////////////////////////////////


este e a classe do objeto seguindo as instrucoes vistas aqui no
public class Teste implements KvmSerializable {

// String PiMatricula;
//String PiTipoEntrada;
public String Nome;
public Integer Idade;

public Teste(String nome, Integer idade){
this.Nome = nome;
this.Idade = idade;
}

public Teste(){

}

//Este metodo é como se fosse um “get especial”
//Você passa o índice da propriedade que você quer buscar

@Override
public Object getProperty(int index) {
return null;
}

//Este método retorna a quantidade de propriedades que a classe
//possui
@Override
public int getPropertyCount() {
return 2;
}

//Este metodo é como se fosse um “set especial”
//você passa o índice da propriedade e o valor
@Override
public void setProperty(int index, Object value) {
switch(index){
case 0:
Nome = value.toString();
break;
case 1:
//Idade =Integer.parseInt(value.toString());
Idade = Integer.parseInt(value.toString());
break;

}


}

//Este metodo define as informações das propriedades para o
//ksoap. Nunca precisei utilizar este método. Mas o ksoap
//precisa dele para definir o tipo complexo
@Override
public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {

switch (index) {
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "Nome";

break;
case 1:
info.type = PropertyInfo.INTEGER_CLASS;
info.name = "Idade";

break;


}
}

@Override
public String getInnerText() {
return null;
}

@Override
public void setInnerText(String s) {

}

//método toString para exibir os dados na tela
public String toString(){
return "NOME: " + Nome +"," + "IDADE: " + Idade;
}
}

Autor:  Nuno_Melo [ 14 Nov 2019, 11:09 ]
Assunto do Tópico:  Re: [TUTORIAL] Consumir Webservices com tipo complexos

Bom Dia
alguem pode me ajudar ai
tenho esta parte de codigo xml do webservice
<soap:Body>
    <RegistarEntradaContentor xmlns="http://tempuri.org/">
      <obj>
        <Tipo>string</Tipo>
        <IdContentor>int</IdContentor>
        <IdEstadoContentor>int</IdEstadoContentor>
        <IdNavio>int</IdNavio>
        <IdTipoMovimentacao>int</IdTipoMovimentacao>
        <IdTipoTrafego>int</IdTipoTrafego>
        <IdDimensaoContentor>int</IdDimensaoContentor>
        <Localizacoes>
          <string>string</string>
          <string>string</string>
        </Localizacoes>
        <NumeroEscala>string</NumeroEscala>
        <NumeroListaDesembarque>string</NumeroListaDesembarque>
        <MatriculaCamiao>string</MatriculaCamiao>
        <NumeroGuiaEntrada>string</NumeroGuiaEntrada>
      </obj>
    </RegistarEntradaContentor>
  </soap:Body>

como faco para declarar o array de strings localizacaoes
na classe Objeto
o dentro das classes
getPropertyInfo;
setProperty;

Página 1 de 1 Todos os Horários estão como UTC - 2 horas [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/