由于前一篇关于Web Service的文章被大家说没有技术含量,我决定对一个简单的Web Service的客户端的代码进行一下分析。
如过你不理解Web Service的概念以及它的基本模型,建议你首先阅读上一篇文章。
下面介绍怎样用代码实现Web Service。
首先打开eclipse新建一个Java工程,去网上下载一个ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar(别看它的名字里带着android,但是非安卓程序也可以使用这个包),然后将这个包导入你的工程。
前提是你要知道你调用的Web Service的URL命名空间以及方法名称(可以从该Web Service的WSDL中获知)。
import java.io.IOException; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.xmlpull.v1.XmlPullParserException; public class Text { private static final String NAMESPACE = "http://WebXml.com.cn/"; //命名空间 private static final String METHOD_NAME = "getWeatherbyCityName"; //方法名称 private SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME); //用命名空间和方法名称构造一个SoapObject类的实例,作为我们与Web Service通信的信纸 private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; //Web Service的URL private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName"; //SOAP Action是“确定执行某一行为的路径”,有些SOAP消息中指明了执行某个命名空间中的某个方法,这时SOAP Action是多余的,下面用到SOAP_ACTION时传null即可 /*但是有些时候SOAP消息并没有显式的指定要调用的服务方法名,而是利用底层的传输协议发送(这样的话,一般会被Web services忽视),例如使用HTTP的Post方式发送的SOAP消息(SOAP消息被放置在HTTP包的包体中)。这时就必须 指定SOAP_ACTION的值,所以为了确保调用成功,还是指定SOAP Action比较好,就是该Web Service方法的命名空间加上方法名字*/ public SoapObject detail; //服务端给我们回信的信纸 public void execute(){ rpc.addProperty("theCityName", "哈尔滨");//将我们要传递给Web Service的参数写在信纸上 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //构造一个信封,构造函数传的参数是Soap协议的版本号,需要根据We bService端的版本号进行设置,大部分情况是Version1.1,也即传VER11即可 envelope.bodyOut = rpc; //将信纸装进信封 envelope.dotNet = true; //为了兼容性要加上这一句 // envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(URL); // 用Web Service的URL构造为我们送信的类的实例(邮递员) try { ht.call(SOAP_ACTION, envelope);// 邮递员将信成功送到,并将回信装在了原来的信封中 detail =(SoapObject) envelope.getResponse(); //打开信封,获得回信,将java.lang.Object类型强转成SoapObject类型 } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } } public static void main(String[] args){ System.out.println("begin:"); Text t = new Text(); t.execute(); System.out.println("received:"); System.out.println("detail" + t.detail); //输出回信内容 System.out.println("detail" + t.detail.getProperty(5));//如果回信是一个数组的话,可以调用getProperty(int n)方法获取回信中第n项的内容 } }