加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

课程实验之调用Webservice

发布时间:2020-12-16 23:42:08 所属栏目:安全 来源:网络整理
导读:一、准备工作: 1、下载ksoap2(后面说明作用)? ?到官网http://code.google.com/p/ksoap2-android/可下载最新jar。 2、新建Android项目,找到AndroidManifest.xml,在manifest/manifest之间加入uses-permission android:name="android.permission.INTERNET" /

一、准备工作:

1、下载ksoap2(后面说明作用)? ?到官网http://code.google.com/p/ksoap2-android/可下载最新jar。

2、新建Android项目,找到AndroidManifest.xml,在<manifest></manifest>之间加入<uses-permission android:name="android.permission.INTERNET" />语句。(由于Android本身线程安全机制的存在,不加入此语句会抛相应网络异常)。

3、将ksoap2 jar包导入项目,方式一:直接复制并粘贴进Android项目中的libs文件夹中。方式二:右键项目,选择Properties->Java ?Build Path->Libraries->Add External JARs 添加对应jar包。


准备工作完成。

二、编写WebService类(有的人可能会问,能不能在MainActivity直接写相关方法,建议最好不要,因为会很麻烦,后面详细说明)

1、定义命名空间、Webservice地址、方法名、方法对应Action等参数:

例:

? ? //命名空间 ?
? ? private static final String NAMESPACE = "http://tempuri.org/"; ?
? ? //WebService地址 ?
? ? private static final String URL = "http://wcf.scaucs.net/MainService.svc"; ?
? ? //需要调用的方法名 ?
? ? private static final String METHOD = "UserLogin";
? ? //方法对应的Action
? ? private static final String ACTION = "http://tempuri.org/IMainService/UserLogin";

2、实例化SoapObject对象并设置方法相关参数:(此时SoapObject相关操作由ksoap2 jar包提供,也就是说没该jar包此处便无法完成)

例:

? ??//1.实例化SoapObject对象 ?
? ? ? ? ? ? SoapObject request = new SoapObject(NAMESPACE,METHOD); ?
? ? ? ? ? ? //2.如果方法需要参数,设置参数 ( UserLogin(strUserName,strPassWordMd5)方法参数)?
? ? ? ? ? ? request.addProperty("strUserName","201131000423");
? ? ? ? ? ? request.addProperty("strPassWordMd5","9775A1BCFFDA8D65C279D2E18E1C7AF0");


3、设置Soap的请求信息,参数部分为Soap协议的版本号(此版本号对应调用服务端版本号,设置错误会抛异常)

例:

? ? ? ? ? ??//3.设置Soap的请求信息,参数部分为Soap协议的版本号 ?
? ? ? ? ? ? SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); ?
? ? ? ? ? ? envelope.dotNet = true;
? ? ? ? ? ? envelope.bodyOut=request;
? ? ? ? ? ? envelope.setOutputSoapObject(request); ? ? ? ? ? ? ?
? ? ? ? ? ??

4、构建Http传输对象:

例:

? ? ? ? ? ??//4.构建传输对象 ?
? ? ? ? ? ? HttpTransportSE transport = new HttpTransportSE(URL); ?
? ? ? ? ? ? transport.debug = true; ?
//设置可否调试


5、访问WebService,第一个参数为调用方法的Aciton,第二个参数为Envelope对象,并取得返回对象

例:

? ? ? ??//5.访问WebService,第二个参数为Envelope对象 ?
? ? ? ? try { ?
? ? ? ? ? ? transport.call(ACTION,envelope);
? ? ? ? ? ? //解析返回的数据
(返回数据的方式有两种,1:envelope.bodyIn 2:envelop.getResponse) ?
? ? ? ? ? ?
String result =?envelope.getResponse().toString();
? ? ? ?
//注意这里envelope返回的数据是SoapObject类型,要经过进一步的解析才能得到想要的数据。(附录详解)

} catch (IOException e) { ?
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (XmlPullParserException e) { ?
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
?

return result;

上述代码完整版本:

public String login(String number) {
? ?? String result = "";
? ? ? ? ? ? //1.实例化SoapObject对象 ?
? ? ? ? ? ? SoapObject request = new SoapObject(NAMESPACE,METHOD); ?
? ? ? ? ? ? //2.如果方法需要参数,设置参数 ?
? ? ? ? ? ? request.addProperty("strUserName",number);
? ? ? ? ? ? request.addProperty("strPassWordMd5","9775A1BCFFDA8D65C279D2E18E1C7AF0");
? ? ? ? ? ? //3.设置Soap的请求信息,参数部分为Soap协议的版本号 ?
? ? ? ? ? ? SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); ?
? ? ? ? ? ? envelope.dotNet = true;
? ? ? ? ? ? envelope.bodyOut=request;
? ? ? ? ? ? envelope.setOutputSoapObject(request); ? ? ? ? ? ? ?
? ? ? ? ? ? //4.构建传输对象 ?
? ? ? ? ? ? HttpTransportSE transport = new HttpTransportSE(URL); ?
? ? ? ? ? ? transport.debug = true; ? ? ? ? ? ? ??
? ? ? ? ? ? //5.访问WebService,envelope);
? ? ? ? ? ? //6.解析返回的数据 ?
? ? ? ? ? ? result = envelope.getResponse().toString();
? ? ? ? } catch (IOException e) { ?
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (XmlPullParserException e) { ?
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } ?
? ? ? ? return result;
? ? } ?


到这里为止调用WebService方法的代码就已经写完了,但是前面已经提过,由于Android的线程安全问题,我们是无法在MainActivity主类中调用WebService的方法的,因此要借用副线程和消息机制来调用。

三、编写辅助副线程WebThread类,和MainActivity类中相应代码

简要解释下以下两个类中的调用原理,详细请看代码:

1、前面所说,由于Android线程安全问题,MainActivity中直接调用WebService的login方法是会抛异常的。

2、所以我们通过消息收发的机制解决此问题,并间接调用WebService

3、在MainActivity按下Button->启动WebThread线程并调用WebService login方法->调用完毕WebThread发送消息0至MainActivity消息收发器handler->当收到消息为0时取login返回值并显示在TextView上。

WebThread类例:

public class WebThread implements Runnable{
public String str_login="";
//判断是否成功的标识符
public boolean inSucess=false;
private String input;
public WebThread(){
}
@Override
public void run() {
// TODO Auto-generated method stub
//创建WebService实例
WebService ws = new WebService();
//UserLogin返回值赋给str_login
str_login=ws.login();

//上述操作完成后向MainActivity的handler发送一条0消息
MainActivity.handler.sendEmptyMessage(0);
}
}

MainActivity类例:

public class MainActivity extends Activity {

//消息收发器Handler
public static Handler handler;
WebThread wt;
Button bt;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//取layout中activity_main.xml布局文件中id为button的按钮并赋给Button bt
bt = (Button)findViewById(R.id.button);
//同Button bt,详细内容可查看layout->activity_main.xml和gen->R.java
text = (TextView)findViewById(R.id.text);
//按下bt按钮启动副线程WebThread
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//实例化WebThread wt
wt =new WebThread();
//启动WebThread wt
new Thread(wt).start();
}
});

//实例化消息收发器handler并设置其收消息响应代码 handler = new Handler(){ public void handleMessage(android.os.Message msg) { //当收到内容为0的消息时 if(msg.what==0){ //text设置为WebService中login方法返回值 text.setText(wt.str_login); } } }; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读