Web Service是实现异构程序之间方法调用的一种机制。Web Service通过一种XML格式的特殊文件来描述方法、参数、调用和返回值,这种格式的XML文件称为WSDL(Web Service Des cription Language),即Web服务器描述语言。Web Service采用的通信协议是SOAP(Simple ObjectAccess Protocol),即简单对象访问协议。
Java领域的Web Service实现有很多方式,例如Sun公司的XML-RPC、Apache的Axis以及Codehaus的Xfire,但是这些都不适合在资源有限的移动设备中使用。早期的Java ME开发中使用到了KSOAP,近期Google也发布了针对Android的KSOAP jar包。该jar文件的访问地址为http://code.google.com/p/ksoap2-android/downloads/list。
android 应用程序要访问互联网上的服务,如天气预报,股票信息;则需要通过SOAP传输协议来访问。 首先要得到服务器提供的地址、命名空间、方法名,参数的键和返回值的键;android应用程序通过这些键来传递值。
具体步骤:
//创建HttpTransportSE对象
HttpTransportSEhttpse = new HttpTransportSE("http://192.168.1.13:8088/testwebservice/LoginPort");
//使用SOAP协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//实例化SoapObject
SoapObjectsoapObject = new SoapObject("http://bean.lovo.com/","validate");
soapObject.addProperty("arg0", usernameText.getText().toString());
soapObject.addProperty("arg1", pwdText.getText().toString());
//将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
envelope.bodyOut = soapObject;
httpse.call(null, envelope);
//获取服务器响应返回的SOAP消息
SoapObject result = (SoapObject) envelope.bodyIn;
//获取返回的数据
String returnStr = result.getProperty("return").toString();
下面的例子是android应用程序访问网络PC服务器。
[html]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
public class WebServiceActivity extends Activity implements OnClickListener{ /**用户名和密码编辑框*/ private EditText
userText,pwdText; /**确定按钮*/ private Button
okBtn; /**显示返回值的文本框*/ private TextView
infoText; /**服务地址*/ private static final String
SERVICE_URL = "http://192.168.1.100:8080/loginservice/LoginServicePort" ; /**命名空间*/ private static final String
NAME_SPACE = "http://service.lovo.com/" ; @Override public void onCreate(Bundle
savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); okBtn
= (Button) findViewById(R.id.web_service_btn); userText=(EditText)
findViewById(R.id.web_service_username); pwdText=(EditText)
findViewById(R.id.web_service_pwd); infoText
= (TextView) findViewById(R.id.web_service_show_info); okBtn.setOnClickListener( this ); } @Override public void onClick(View
v) { if (v
== okBtn){ //连接对象 HttpTransportSE
httpSE = new HttpTransportSE(SERVICE_URL); //通过SOAP1.1协议得到envelop对象 SoapSerializationEnvelope
envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11); //根据命名空间和方法得到SoapObject对象 SoapObject
soapObject = new SoapObject(NAME_SPACE, "validate" ); //向调用方法传递参数 soapObject.addProperty( "arg0" ,
userText.getText().toString()); soapObject.addProperty( "arg1" ,
pwdText.getText().toString()); //将soapObject对象设置为envelop对象,传出消息 envelop.bodyOut
= soapObject; try { //开始调用远程方法 httpSE.call( null ,
envelop); //得到远程方法返回的SOAP对象 SoapObject
resultObj = (SoapObject) envelop.bodyIn; //得到服务器传回的数据 String
resultStr = resultObj.getProperty( "return" ).toString(); //处理返回值 Toast.makeText( this ,
resultStr, Toast.LENGTH_LONG).show(); infoText.setText(resultStr); } catch (Exception
e) { e.printStackTrace(); } } } } public class WebServiceActivity extends Activity implements OnClickListener{ /**用户名和密码编辑框*/ private EditText
userText,pwdText; /**确定按钮*/ private Button
okBtn; /**显示返回值的文本框*/ private TextView
infoText; /**服务地址*/ private static final String
SERVICE_URL = "http://192.168.1.100:8080/loginservice/LoginServicePort" ; /**命名空间*/ private static final String
NAME_SPACE = "http://service.lovo.com/" ; @Override public void onCreate(Bundle
savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); okBtn
= (Button) findViewById(R.id.web_service_btn); userText=(EditText)
findViewById(R.id.web_service_username); pwdText=(EditText)
findViewById(R.id.web_service_pwd); infoText
= (TextView) findViewById(R.id.web_service_show_info); okBtn.setOnClickListener( this ); } @Override public void onClick(View
v) { if (v
== okBtn){ //连接对象 HttpTransportSE
httpSE = new HttpTransportSE(SERVICE_URL); //通过SOAP1.1协议得到envelop对象 SoapSerializationEnvelope
envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11); //根据命名空间和方法得到SoapObject对象 SoapObject
soapObject = new SoapObject(NAME_SPACE, "validate" ); //向调用方法传递参数 soapObject.addProperty( "arg0" ,
userText.getText().toString()); soapObject.addProperty( "arg1" ,
pwdText.getText().toString()); //将soapObject对象设置为envelop对象,传出消息 envelop.bodyOut
= soapObject; try { //开始调用远程方法 httpSE.call( null ,
envelop); //得到远程方法返回的SOAP对象 SoapObject
resultObj = (SoapObject) envelop.bodyIn; //得到服务器传回的数据 String
resultStr = resultObj.getProperty( "return" ).toString(); //处理返回值 Toast.makeText( this ,
resultStr, Toast.LENGTH_LONG).show(); infoText.setText(resultStr); } catch (Exception
e) { e.printStackTrace(); } } } } |
注意:要增加一个network访问权限。
<uses-permission android:name="android.permission.INTERNET"/>