Consumir WebService com KSOAP2

6 respostas
A

Alguém pode me ajudar com WebService no Android?

Já estou há 1 mês pesquisando sobre o assunto e tudo o que consegui até agora foi desenvolver um WS em Java, que realiza a consulta no MySQL e retorna os dados de Latitude e Longitude de uma tabela de locais específicos. Preciso fazer com que minha aplicação consuma o WS e coloque o retorno do WS em uma variável.

O WS retorna o seguinte dado:

<a>ns:queryLatitudeResponse</a>

<a>ns:return</a>-25.421571</ns:return>

<a>ns:return</a>-26.878695</ns:return>

<a>ns:return</a>-27.878695</ns:return>

</ns:queryLatitudeResponse>

No Android, eu tenho uma classe que é responsável por consumir o WS e ela armazena o resultado em variáveis que serão passadas por parâmetro para outra classe:

public class Conexao extends Activity {

    private static final String SOAP_ACTION = "http://localhost:8080/axis2/services/ObterGeoPointService/queryLatitude";
    private static final String METHOD_NAME = "queryLatitude";
    private static final String NAMESPACE = "http://localhost:8080/axis2/services/ObterGeoPointService";
    private static final String URL = " http://localhost:8080/axis2/services/ObterGeoPointService?wsdl";
  
   
    double lat, lon = 0;

    public Conexao() {
       
        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            androidHttpTransport.call(SOAP_ACTION, envelope);
           
            Object result = envelope.getResponse();
            String[] results = (String[]) result;
            lat =Double.parseDouble(results[0]);
            lon = Double.parseDouble(results[1]);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public double getLatitude(){
        return this.lat;
    }
    public double getLongitude(){
        return this.lon;
    }
}

O problema é que não entra no Try, cai direto no catch.

6 Respostas

leo.alvesneuwald

Qual o erro que é apresentado?

A
org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@1:6 in java.io.InputStreamReader@3281db25) 
	at org.kxml2.io.KXmlParser.exception(Unknown Source)
	at org.kxml2.io.KXmlParser.require(Unknown Source)
	at org.ksoap2.SoapEnvelope.parse(Unknown Source)
	at org.ksoap2.transport.Transport.parseResponse(Unknown Source)
	at org.ksoap2.transport.HttpTransportSE.call(Unknown Source)
	at teste.Conexao.main(Conexao.java:28)
leo.alvesneuwald

Eu também estou com esse mesmo erro. Debugando é possível ver que bem na linha

Alguém pode ajudar?

Tentei em outros fóruns mais nada.

A

Eu consegui resolver, o que estava errado eram os endereços passados nas Strings URL, NAMESPACE, etc…

Para corrigir, eu olhei o xml do wsdl:

<wsdl:definitions targetNamespace="http://com"> // este é o nome cooreto do NAMESPACE
<wsdl:documentation>ObterGeoPointService</wsdl:documentation> // este é o nome correto do 
<wsdl:types><xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://com">
<xs:element name="queryLatitude">

Veja como ficaram as declarações no meu código:

String SOAP_ACTION = "ObterGeoPointService";
		String METHOD_NAME = "queryLatitude";
		String NAMESPACE = "http://com";
		String URL = " http://localhost:8080/axis2/services/ObterGeoPointService?wsdl";

Espero que isto te ajude.

leo.alvesneuwald

Boa noite,

Cara, meu WSDL está conforme abaixo:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions targetNamespace="http://server.soap.codelab.appengine.google.com/" name="EntityAPIService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://server.soap.codelab.appengine.google.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://server.soap.codelab.appengine.google.com/" schemaLocation="EntityAPIService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="createOrUpdateRegistro">
    <part name="parameters" element="tns:createOrUpdateRegistro"/>
  </message>
  <message name="createOrUpdateRegistroResponse">
    <part name="parameters" element="tns:createOrUpdateRegistroResponse"/>
  </message>
  <message name="getItemsForProduct">
    <part name="parameters" element="tns:getItemsForProduct"/>
  </message>
  <message name="getItemsForProductResponse">
    <part name="parameters" element="tns:getItemsForProductResponse"/>
  </message>
  <portType name="EntityAPI">
    <operation name="createOrUpdateRegistro">
      <input message="tns:createOrUpdateRegistro"/>
      <output message="tns:createOrUpdateRegistroResponse"/>
    </operation>
    <operation name="getItemsForProduct">
      <input message="tns:getItemsForProduct"/>
      <output message="tns:getItemsForProductResponse"/>
    </operation>
  </portType>
  <binding name="EntityAPIPortBinding" type="tns:EntityAPI">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="createOrUpdateRegistro">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="getItemsForProduct">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="EntityAPIService">
    <port name="EntityAPIPort" binding="tns:EntityAPIPortBinding">
      <soap:address location="http://diabetescontrolws.appspot.com/"/>
    </port>
  </service>
</definitions>

E minhas variáveis estão como

private static final String SOAP_ACTION = "";
	private static final String METHOD_NAME = "createOrUpdateRegistro";
	private static final String NAMESPACE = "http://server.soap.codelab.appengine.google.com/";
	private static final String URL = "http://diabetescontrolws.appspot.com/EntityAPIService.wsdl";
Quando debugo e chega na linha
androidHttpTransport.call(SOAP_ACTION, envelope);
apresenta o erro:
org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <definitions targetNamespace='http://server.soap.codelab.appengine.google.com/' name='EntityAPIService'>@3:303 in java.io.InputStreamReader@413aeac8)

Alguém pode me ajudar?

tonyam

Estou passando por isso, pior que quando emulo do android 233, funciona quando é uma versão maior não funciona, e ocorre esse mesmo erro.

Criado 21 de abril de 2012
Ultima resposta 15 de mai. de 2012
Respostas 6
Participantes 3