首先附上我在實現過程中參考的兩篇十分有用的文檔:
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.完成天氣網站可支持省份接口的調用:如圖
6.確認soap正常工作,更換公司內網,修改代碼調用公司後臺服務:(代碼跟Linux 端調用區別較大,具體參看工程代碼):如圖
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://tempuri.org/";
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");
// Toast.makeText(MainActivity.this, "Response" + resultString.toString(), Toast.LENGTH_LONG).show();
}
}
public void calculate() {
String serviceURL="http://10.0.5.47:9080/TmriOutAccess.svc?singleWsdl";
String getSupportCity="getSupportCity";
String getSupportProvince="getSupportProvince";
String query="queryObjectOut";
String para = "<?xml version=\"1.0\" encoding=\"gb2312\"?> <root> <QueryCondition> <SN>123456</SN> </QueryCondition></root> ";
try {
//SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
///Request.addProperty("Celsius", getCel);
SoapObject soapObject = new SoapObject("http://tempuri.org/", query);
soapObject.addProperty("xtlb","17");
soapObject.addProperty("jkxlh","17J01");
soapObject.addProperty("jkid","17J01");
soapObject.addProperty("xmlDoc",para);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(soapObject);
HttpTransportSE transport = new HttpTransportSE(serviceURL);
transport.debug=true;
transport.call("http://tempuri.org/ITmriOutAccess/queryObjectOut", soapEnvelope);
Object result = (Object) soapEnvelope.getResponse();
Log.i(TAG, "Result Celsius: " + result);
xx = result.toString();
} catch (Exception ex) {
Log.e(TAG, "Error: " + ex.getMessage());
}
}
}
上面就是測試的簡單程序,如果做過linux 下的soap 調用應該會熟悉一些,在Android下不需要引用獲得文件,這是比較大的區別。
再一個就是演示 namespace 的確定和 參數的添加(soapObjetc.addProperty的使用),我也在這裏來回實驗,debug 根據錯誤信息修改代碼和相應的參數才試出來。