由于前一篇关于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项的内容
}
}