声明服务调用需要的地址和方法
private String nameSpace="http://www.juame.edu";//和wcf服务契约特性的Namespace是一样的
private String url="http://172.21.212.54:8888/TestService.svc";//svc服务地址
private String soapAction="http://www.juame.edu/JuameService/Add";//操作地址
private String methodName="Add";//方法名称
上面声明的服务地址、命名空间、操作地址和方法名称都可以从服务的wsdl文档中查看,

下面利用ksoap2对服务进行调用的代码如下。
protected SoapObject getSoapResult(int op1,int op2){
SoapObject outObject=new SoapObject(nameSpace,methodName);
//添加输出参数
outObject.addProperty("op1", op1);
outObject.addProperty("op2",op2);
SoapSerializationEnvelope serializationEnvelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);//设置soap版本
serializationEnvelope.bodyOut=outObject;
serializationEnvelope.dotNet=true;//调用.NET的服务
HttpTransportSE transportSE=new HttpTransportSE(url);
transportSE.debug=true;//采用调试
try{
transportSE.call(soapAction, serializationEnvelope);//调用服务
SoapObject result=(SoapObject)serializationEnvelope.bodyIn;//获取调用结果
Log.v("happy1", "服务调用成功");
//把结果封送到消息中去,让ui线程显示
Bundle bundle=new Bundle();
bundle.putString("result", result.getProperty(0).toString());//获取结果中的值
Message message=new Message();
message.setData(bundle);
message.what=12;
hander.sendMessage(message);
return result;
}catch(IOException ex){
Log.v("sad", "IO异常");
ex.printStackTrace();
}catch(XmlPullParserException ex){
Log.v("sad", "xml解析异常");
ex.printStackTrace();
}catch(Exception ex){
Log.v("sad", "服务调用异常异常");
}
return null;
}
按钮事件代码,采用多线程。在android3.0后,有关网络资源的调用代码都不能直接在主UI线程中调用,否则会出现android.os.NetworkOnMainThreadException异常。关于android中的多线程机制有时间再进行总结。
//绑定按钮事件
btnJlx.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Thread thread=new Thread(getSoapRequest);
thread.start();
}
});
//线程
Runnable getSoapRequest=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
getSoapResult(10, 20);
}
};
//消息处理
Handler hander = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what=12){
lblResult.append(msg.getData().getString("result")+"rn");
}
}
};
到目前为止,我们已经调用了wcf服务第一个服务,就说明传递基类型是没有问题。但是很遗憾的是,对于传递复杂类型和数组集合参数进行调用,在服务那边总是提示无法对传递进来的数据进行反序列化的错误(希望高手指点)。还好我们可以把所以的服务类型都转为json数据,通过json数据进行传递调用,就可以解决复杂类型传递的问题。
对于有强迫症的我来说,不甘心,因为在网上看了许多的教程,利用Ksoap2是可以直接传递复杂类型的来调用.NET平台的服务的。不过网上大部分教程调用的都是传统的webservice服务(asmx文件),于是我就在wcf服务项目中新建一个传统的asmx文件,提供的服务与wcf服务一样的。结果发现,果然能够利用ksoap2传递一个复杂类型来调用服务。下一节总结利用ksoap2传递复杂对象来调用传统的webservice服务。
3 传统的WebService服务
为了和wcf服务进行对比,webservice提供的服务和wcf一致,代码如下:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public int Add(int op1, int op2)
{
return op1 + op2;
}
[WebMethod]
public string PostPeopleInfo(People people)
{
return "姓名:" + people.Name + "/" + "年龄:" + people.Age;
}
}
其中WebService特性中的Namespace属性和wcf的Namespace的作用一样的。
同样的也在iis中进行发布。发布成功之后,能够访问到asmx文件。
4 Android调用WebService服务
不管是调用WCF的服务还是WebService的服务,传递基类型去调用,代码都是一样的,且能够正确的调用。下面利用复杂的People类型来调用WebService的服务。 (编辑:应用网_丽江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|