简介:java
SoapObject : 指定webservice的命名空间和调用的方法名
SoapSerializationEnvelope :生成调用Webservice方法的SOAP请求信息
HttpTransportSE : 建立HttpTransportsSE对象。经过HttpTransportsSE类的构造方法能够指定WebService的WSDL文档的URL
使用call方法调用WebService方法
使用getResponse方法得到WebService方法的返回结果android
正文:web
首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 下载地址浏览器
而后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图:服务器
同时,只添加jar包肯能是不够的,须要添加class folder,便可以再工程的libs文件夹中加入下载的KSOAP包,如图:ide
环境配好以后能够用下面七个步骤来调用WebService方法:网站
第一:实例化SoapObject对象,指定webService的命名空间(从相关WSDL文档中能够查看命名空间),以及调用方法名称。如:ui
/命名空间 privatestatic final String serviceNameSpace="http://WebXml.com.cn/"; //调用方法(得到支持的城市) privatestatic final String getSupportCity="getSupportCity"; //实例化SoapObject对象 SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
第二步:假设方法有参数的话,设置调用方法参数:this
request.addProperty("参数名称","参数值");
第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):spa
//得到序列化的Envelope SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request;
第四步:注册Envelope:
(new MarshalBase64()).register(envelope);
第五步:构建传输对象,并指明WSDL文档URL:
/请求URL privatestatic final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; //Android传输对象 AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL); transport.debug=true;
第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
第七步:解析返回数据:
if(envelope.getResponse()!=null){ return parse(envelope.bodyIn.toString()); }
------------------------------------------------------------------------------------------------------------------------------------------
例子:具体详见http://blog.csdn.net/zd_1471278687/article/details/11925349
这里有个地址提供webService天气预报的服务网站,在浏览器中输入网站:http://www.webxml.com.cn/webservices/weatherwebservice.asmx能够看到该网站提供的
调用方法,点进去以后能够看到调用时须要输入的参数,固然有的不须要参数,例如:getSupportProvince ,而getSupportCity须要输入查找的省份名,getWeatherbyCityName 须要输入查找的城市名。接下来咱们就利用这三个接口得到数据,并作出显示:
得到本天气预报Web Service支持的洲,国内外省份和城市信息:
public class MainActivity extends Activity { // WSDL文档中的命名空间 private static final String targetNameSpace = "http://WebXml.com.cn/"; // WSDL文档中的URL private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"; // 须要调用的方法名(得到本天气预报Web Services支持的洲、国内外省份和城市信息) private static final String getSupportProvince = "getSupportProvince"; private List<Map<String,String>> listItems; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listItems = new ArrayList<Map<String,String>>(); mListView = (ListView) findViewById(R.id.province_list); new NetAsyncTask().execute(); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String mProvinceName = listItems.get(position).get("province"); Log.d("ProvinceName", mProvinceName); Intent intent = new Intent(); intent.putExtra("Pname", mProvinceName); intent.setClass(MainActivity.this, CityActivity.class); startActivity(intent); } }); } class NetAsyncTask extends AsyncTask<Object, Object, String> { @Override protected void onPostExecute(String result) { if (result.equals("success")) { //列表适配器 SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, listItems, R.layout.province_item, new String[] {"province"}, new int[]{R.id.province}); mListView.setAdapter(simpleAdapter); } super.onPostExecute(result); } @Override protected String doInBackground(Object... params) { // 根据命名空间和方法获得SoapObject对象 SoapObject soapObject = new SoapObject(targetNameSpace, getSupportProvince); // 经过SOAP1.1协议获得envelop对象 SoapSerializationEnvelope envelop = new SoapSerializationEnvelope( SoapEnvelope.VER11); // 将soapObject对象设置为envelop对象,传出消息 envelop.dotNet = true; envelop.setOutputSoapObject(soapObject); // 或者envelop.bodyOut = soapObject; HttpTransportSE httpSE = new HttpTransportSE(WSDL); // 开始调用远程方法 try { httpSE.call(targetNameSpace + getSupportProvince, envelop); // 获得远程方法返回的SOAP对象 SoapObject resultObj = (SoapObject) envelop.getResponse(); // 获得服务器传回的数据 int count = resultObj.getPropertyCount(); for (int i = 0; i < count; i++) { Map<String,String> listItem = new HashMap<String, String>(); listItem.put("province", resultObj.getProperty(i).toString()); listItems.add(listItem); } } catch (IOException e) { e.printStackTrace(); return "IOException"; } catch (XmlPullParserException e) { e.printStackTrace(); return "XmlPullParserException"; } return "success"; } } }