簡體   English   中英

通過Android訪問Webservice-KSOAP2

[英]Accessing Webservice by Android - KSOAP2

我正在創建一個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();
    }
}

}

我需要訪問“ ObterIdentificadorLoja”,僅能始終給出錯誤或“無法識別標頭”或“超時”或“未將引用設置為實例或對象”,並且我已經嘗試了幾種方法。

我在哪里想念?

正如您的錯誤明確指出的那樣,您有SOAPAction不匹配。

您在發出SOAP請求時正在使用http://www.dominio.com/servicos/ObterIdentificadorLoja

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM