首先附上我在實現過程中參考的兩篇十分有用的文檔:
1.https://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html
2.https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/
工具準備:
OPPO k3 Android (9.0)手機,http://www.webxml.com.cn 天氣測試網站, Android studio 3.2開發環境
實現步驟:
- 建立Android工程 增加輸入,顯示框和按鈕
- 下載:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 包
- 把第二步下載的包拷貝到工程目錄app/libs 下
- 在Android studio 添加包到工程
- 編寫代碼調用公開的網絡天氣接口驗證工程代碼。
具體實現:
1. 建立工程,輸入,顯示框和按鈕 滿足測試需要如圖:
2.下載soap包 https://download.csdn.net/download/zz_mm/3946373 (要積分,我也找人要的)
3.複製到相應目錄如圖:
4.以添加第三方模塊的方式添加到工程如圖:
5.完成天氣網站可支持省份接口的調用:如圖
調用成功!
下面是簡單的測試代碼,如果你沒有做過soap的話有的難度,但是隻要遵循固定的調用順序基本沒有問題,在調試過程中遇到很多問題,不要慌,多搜基本都能解決,實在解決不了,歇一會兒明天在看就不一樣了。
package com.example.superman.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.AndroidHttpTransport;
public class MainActivity extends AppCompatActivity {
String TAG = "Response";
Button bt;
EditText celcius;
TextView txt;
String getCel;
SoapPrimitive resultString;
//命名空間
private static final String serviceNameSpace="http://WebXml.com.cn/";
//調用方法(獲得支持的城市)
private static final String getSupportCity="getSupportCity";
String xx="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
celcius = (EditText) findViewById(R.id.cel);
txt = (TextView) findViewById(R.id.txt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getCel = celcius.getText().toString();
AsyncCallWS task = new AsyncCallWS();
task.execute();
txt.setText(xx);
//calculate();
}
});
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, "doInBackground");
calculate();
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i(TAG, "onPostExecute");
}
}
public void calculate() {
String SOAP_ACTION = "http://www.webxml.com.cn/getSupportProvince";
String serviceURL="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
String getSupportCity="getSupportCity";
String getSupportProvince="getSupportProvince";
try {
SoapObject soapObject = new SoapObject(serviceNameSpace, getSupportProvince);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(soapObject);
HttpTransportSE transport = new HttpTransportSE(serviceURL);
transport.debug=true;
transport.call(serviceNameSpace+getSupportProvince, soapEnvelope);
SoapObject result = (SoapObject) soapEnvelope.getResponse();
Log.i(TAG, "Result Celsius: " + result);
xx = result.toString();
} catch (Exception ex) {
Log.e(TAG, "Error: " + ex.getMessage());
}
}
}