我正在创建一个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;,我已经尝试了几种方法..
我可以在哪里遗失?
答案 0 :(得分:0)
由于您的错误明确说明,您SOAPAction
不匹配。
您在发出SOAP请求时正在使用http://www.dominio.com/servicos/ObterIdentificadorLoja
,
但是,在您的WSDL中,您有http://tempuri.org/ObterIdentificadorLoja