首先附上我在实现过程中参考的两篇十分有用的文档:
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());
}
}
}