在android中调用soap webservice

我需要在Android设备中调用soap webservice。 我一直在阅读stackoverflow和其他页面上的很多文章,看video…但我已经尝试了所有的东西,我无法让它在我的Android设备上工作,我无法在模拟器上测试,因为我的电脑无法处理其中任何一个,所以我不知道错误是在代码上还是我的Android设备问题。

布局xml只是一个EditText,一个Button和一个TextView。

在这个链接中你可以看到我需要发送到webservice的请求xml(我应该使用SOAP 1.1还是SOAP 1.2?) http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry

这是我的实际代码,我尝试了许多其他方法,但没有一个方法适合我。 有帮助吗? (url,namespace,soap_action和method_name值都是okey,不是吗?)

package com.example.doazdoas.webservice_prueba; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.os.AsyncTask; import android.widget.Toast; import static android.content.ContentValues.TAG; public class MainActivity extends Activity{ private TextView textResult; private Button buttonSend; String NAMESPACE = "http://www.webserviceX.NET/"; String METHOD_NAME = "GetCitiesByCountry"; String SOAP_ACTION = NAMESPACE + METHOD_NAME; String URL = "http://www.webservicex.net/globalweather.asmx?WSDL"; private Object resultsRequestSOAP = null; HttpTransportSE androidHttpTransport; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textResult = (TextView)findViewById(R.id.textResultado); buttonSend = (Button)findViewById(R.id.buttonEnviar); //setContentView(tv); } public void onClickEnviar(View view){ AsyncCallWS task = new AsyncCallWS(); task.execute(); } private class AsyncCallWS extends AsyncTask { @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute"); } @Override protected Void doInBackground(Void... params) { Log.i(TAG, "doInBackground"); sendRequest(); return null; } @Override protected void onPostExecute(Void result) { Log.i(TAG, "onPostExecute"); Log.d("dump Request: " ,androidHttpTransport.requestDump); Log.d("dump response: " ,androidHttpTransport.responseDump); } } public void sendRequest(){ SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //SoapObject request.addProperty("@CountryName", "SPAIN"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); resultsRequestSOAP = envelope.getResponse(); String[] results = (String[]) resultsRequestSOAP; textResult.setText( results[0]); } catch (Exception aE) { aE.printStackTrace (); } } } 

你可以在doInBackGround做任何与UI相关的操作,所以在onPostExecute methnod中移动它们。

因为doInBackGround不是UI线程。 请仔细阅读AsyncTask文档。 无论您从doInBackGround返回的数据是doInBackGround ,它都被视为onPostExecute输入。

所以改变你的代码如下,

  private class AsyncCallWS extends AsyncTask { @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute"); } @Override protected String[] doInBackground(Void... params) { Log.i(TAG, "doInBackground"); String[] data = sendRequest(); return data; } @Override protected void onPostExecute(String[] result) { Log.i(TAG, "onPostExecute"); if(result != null && result.length > 0){ textResult.setText( results[0]); } } } private String[] sendRequest(){ SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //SoapObject request.addProperty("@CountryName", "SPAIN"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); resultsRequestSOAP = envelope.getResponse(); String[] results = (String[]) resultsRequestSOAP; } catch (Exception aE) { aE.printStackTrace (); } } 

私有类AsyncCallWS扩展AsyncTask {

  private String[] data; @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute"); } @Override protected String[] doInBackground(Void... params) { Log.i(TAG, "doInBackground"); data = sendRequest(); return data; } @Override protected void onPostExecute(String[] result) { Log.i(TAG, "onPostExecute"); if(result != null && result.length > 0){ Log.d("dump Request: " ,androidHttpTransport.requestDump); Log.d("dump response: " ,androidHttpTransport.responseDump); textResult.setText( result[0]); }else{ Log.d("Error","There's no answer"); } } } 

我改变了它,现在就像这样…但它总是打印出没有答案

您是否考虑过不使用图书馆来制作肥皂请求? 我之前遇到了同样的问题,这让我发现库会让你的工作更加努力,尤其是在对请求结构进行更改时。 这就是你如何在不使用库的情况下发出soap请求:首先,你需要知道如何使用SOAP Ui这是一个Windows应用程序。 您可以在此处导入您的wsdl文件,如果它的语法正确,那么您将看到一个显示Web服务请求正文的屏幕。 您可以输入测试值,您将获得响应结构。 此链接将指导您如何使用肥皂ui https://www.soapui.org/soap-and-wsdl/working-with-wsdls.html

现在转到android代码:

我们将创建一个名为runTask的类,它扩展异步任务并使用http发送请求体并获取请求响应:

  private class runTask extends AsyncTask { private String response; String string = "your string parameter" String SOAP_ACTION = "your soap action here"; String stringUrl = "http://your_url_here"; //if you experience a problem with url remove the '?wsdl' ending @Override protected String doInBackground(String... params) { try { //paste your request structure here as the String body(copy it exactly as it is in soap ui) //assuming that this is your request body String body = "" + ""+ ""+ ""+string+""+ ""+ ""+ ""; try { URL url = new URL(stringUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDefaultUseCaches(false); conn.setRequestProperty("Accept", "text/xml"); conn.setRequestProperty("SOAPAction", SOAP_ACTION); //push the request to the server address OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(body); wr.flush(); //get the server response BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder builder = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { builder.append(line); response = builder.toString();//this is the response, parse it in onPostExecute } } catch (Exception e) { e.printStackTrace(); } finally { try { reader.close(); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } return response; } /** * @see AsyncTask#onPostExecute(Object) */ @Override protected void onPostExecute(String result) { try { Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } 

现在只需执行课程并观察魔法发生:

 runTask runner = new runTask(); runner.execute(); 

您可以使用DOM或SAX解析器解析响应以获取所需的值。 请随时要求进一步澄清。