通过Android访问Web服务 - KSOAP2

时间:2014-09-05 14:21:03

标签: java android web-services

我正在创建一个Android应用程序,我必须连接我公司的Web服务来执行登录系统,我使用的是3.3.0 KSOAP2 lib。

我的WS的路径如下:http://www.dominio.com/servicos/ws.asmx

我的问题发生了:

09-04 10:57:52.835: W/System.err(19717): 
SoapFault - faultcode: 'soap:Client' faultstring: 
'Server did not recognize the value of HTTP Header SOAPAction:
http://www.dominio.com/servicos/ObterIdentificadorLoja.'
faultactor: 'null' detail: org.kxml2.kdom.Node@428e60d0

为连接存储的变量:

private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://www.dominio.com/servicos/ws.asmx";
private final String SOAP_ACTION = "http://tempuri.org/ObterIdentificadorLoja";
private final String METHOD_NAME = "ObterIdentificadorLoja";
private String TAG = "LOGAR";

我的WSDL是:

<wsdl:operation name="ObterIdentificadorLoja">
<soap:operation soapAction="http://tempuri.org/ObterIdentificadorLoja" style="document"/>

源.Java代码已满:

package com.testes.infovendas;

//Imports
import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;

//KSOAP2 -- Lib de conexão Webservice SOAP
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

//Adicionais
import com.testes.infovendas.R;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class InfoVendas extends ActionBarActivity {

//Variáveis
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://www.dominio.com/servicos/ws.asmx";
private final String SOAP_ACTION = "http://tempuri.org/ObterIdentificadorLoja";
private final String METHOD_NAME = "ObterIdentificadorLoja";
private String TAG = "ASSYNC";
private static String cnpj_cpf_codclie, codloja, seguranca, identificadorloja;
Button b;
TextView tv;
EditText et1,et2,et3,et4;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    //Identificando cada campo e função
    et1 = (EditText) findViewById(R.id.editCodloja);
    et2 = (EditText) findViewById(R.id.editCPF);
    et3 = (EditText) findViewById(R.id.editUser);
    et4 = (EditText) findViewById(R.id.editPass);
    tv = (TextView) findViewById(R.id.login_informa);
    b = (Button) findViewById(R.id.btnEnviar);
    //Listener para quando clicar no botão Enviar
    b.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            //Se todos os campos forem preenchidos, será retomado o login
            if (et1.getText().length() != 0 && et1.getText().toString() != "" || 
                    et2.getText().length() != 0 && et2.getText().toString() != "" || 
                    et3.getText().length() != 0 && et3.getText().toString() != "" || 
                    et4.getText().length() != 0 && et4.getText().toString() != "") {

                //Pega todas as informações escritas nos campos e adiciona em suas respectivas variáveis para uso do WS
                codloja = et1.getText().toString();
                cnpj_cpf_codclie = et2.getText().toString();
                seguranca = "chavesecreta";

                AsyncCallWS task = new AsyncCallWS();
                task.execute();

            } 
            //Se não for preenchido todos os campos, será retornado um TextView apenas informado para informar corretamente
            else {
                tv.setText("Por favor, insira todos os dados.");
            }
        }
    });
}

//Classe AsyncCallWS
private class AsyncCallWS extends AsyncTask<String, Void, Void> {

    //Retorna como null o valor do Identificador
    @Override
    protected Void doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        getIdentificador(cnpj_cpf_codclie, codloja, seguranca);
        return null;
    }

    //Mensagem e ação pós conclusão
    @Override
    protected void onPostExecute(Void result) {
        Log.i(TAG, "onPostExecute");
        tv.setText("identificador nº: " + identificadorloja + "  Conexão estabelecida. Realizando o login...");
    }

    //Mensagem ao clicar no botão Enviar
    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
        tv.setText("Estabelecendo conexão ao servidor...");
    }


    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i(TAG, "onProgressUpdate");
    }

}

//Classe para obter os dados do Identificador
public void getIdentificador(String cnpj_cpf_codclie, String codloja, String seguranca) {
    //Create request
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    //Property which holds input parameters
    PropertyInfo identificadorPI = new PropertyInfo();
    //Set Name
    identificadorPI.setName("identificadorloja");
    //Set Value
    identificadorPI.setValue(identificadorloja);
    //Set dataType
    identificadorPI.setType(double.class);
    //Add the property to request object
    request.addProperty(identificadorPI);
    //Create envelope
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;
    //Set output SOAP object
    envelope.setOutputSoapObject(request);
    //Create HTTP call object
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        //Invoke web service
        androidHttpTransport.call(SOAP_ACTION, envelope);
        //Get the response
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
        //Define identificadorloja como uma variável estática
        identificadorloja = response.toString();

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

}

我需要访问&#34; ObterIdentificadorLoja&#34;,只是总是会出错或者#34;标题无法识别&#34;或&#34;超时&#34;或&#34;引用没有设置为实例或对象&#34;,我已经尝试了几种方法..

我可以在哪里遗失?

1 个答案:

答案 0 :(得分:0)

由于您的错误明确说明,您SOAPAction不匹配。

您在发出SOAP请求时正在使用http://www.dominio.com/servicos/ObterIdentificadorLoja

但是,在您的WSDL中,您有http://tempuri.org/ObterIdentificadorLoja