Android调用Xfire开发的java-webservice

来源:互联网 发布:nginx搭建静态服务器 编辑:程序博客网 时间:2024/05/17 07:46

这里注重讲解如何开发Android-webservice。java如何开发webservice就不在描述。生成的wsdl文件如下。(测试方法)

  <?xml version="1.0" encoding="UTF-8" ?> - <wsdl:definitions targetNamespace="http://dao.simul.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://dao.simul.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">- <wsdl:types>- <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://dao.simul.com">- <xsd:element name="uploadCMAHeartbeatInfo">- <xsd:complexType>- <xsd:sequence>  <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" />   </xsd:sequence>  </xsd:complexType>  </xsd:element>- <xsd:element name="uploadCMAHeartbeatInfoResponse">- <xsd:complexType>- <xsd:sequence>  <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" />   </xsd:sequence>  </xsd:complexType>  </xsd:element>- <xsd:element name="sayHello">- <xsd:complexType>- <xsd:sequence>  <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" />   </xsd:sequence>  </xsd:complexType>  </xsd:element>- <xsd:element name="sayHelloResponse">- <xsd:complexType>- <xsd:sequence>  <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" />   </xsd:sequence>  </xsd:complexType>  </xsd:element>  </xsd:schema>  </wsdl:types>- <wsdl:message name="sayHelloResponse">  <wsdl:part name="parameters" element="tns:sayHelloResponse" />   </wsdl:message>- <wsdl:message name="uploadCMAHeartbeatInfoRequest">  <wsdl:part name="parameters" element="tns:uploadCMAHeartbeatInfo" />   </wsdl:message>- <wsdl:message name="uploadCMAHeartbeatInfoResponse">  <wsdl:part name="parameters" element="tns:uploadCMAHeartbeatInfoResponse" />   </wsdl:message>- <wsdl:message name="sayHelloRequest">  <wsdl:part name="parameters" element="tns:sayHello" />   </wsdl:message>- <wsdl:portType name="mywebservicePortType">- <wsdl:operation name="uploadCMAHeartbeatInfo">  <wsdl:input name="uploadCMAHeartbeatInfoRequest" message="tns:uploadCMAHeartbeatInfoRequest" />   <wsdl:output name="uploadCMAHeartbeatInfoResponse" message="tns:uploadCMAHeartbeatInfoResponse" />   </wsdl:operation>- <wsdl:operation name="sayHello">  <wsdl:input name="sayHelloRequest" message="tns:sayHelloRequest" />   <wsdl:output name="sayHelloResponse" message="tns:sayHelloResponse" />   </wsdl:operation>  </wsdl:portType>- <wsdl:binding name="mywebserviceHttpBinding" type="tns:mywebservicePortType">  <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="uploadCMAHeartbeatInfo">  <wsdlsoap:operation soapAction="" /> - <wsdl:input name="uploadCMAHeartbeatInfoRequest">  <wsdlsoap:body use="literal" />   </wsdl:input>- <wsdl:output name="uploadCMAHeartbeatInfoResponse">  <wsdlsoap:body use="literal" />   </wsdl:output>  </wsdl:operation>- <wsdl:operation name="sayHello">  <wsdlsoap:operation soapAction="" /> - <wsdl:input name="sayHelloRequest">  <wsdlsoap:body use="literal" />   </wsdl:input>- <wsdl:output name="sayHelloResponse">  <wsdlsoap:body use="literal" />   </wsdl:output>  </wsdl:operation>  </wsdl:binding>- <wsdl:service name="mywebservice">- <wsdl:port name="mywebserviceHttpPort" binding="tns:mywebserviceHttpBinding">  <wsdlsoap:address location="http://113.140.93.110:8888/mywebservice/services/mywebservice" />   </wsdl:port>  </wsdl:service>  </wsdl:definitions>

其中uploadCMAHeartbeatInfo和sayHello都是要访问的接口方法。

建立Android项目。添加ksoap2-android-assembly-2.4-jar-with-dependencies.jar到项目中。

新建类:WebServiceHelper.java

 

package com.sunny;import java.io.IOException;import org.ksoap2.SoapEnvelope;import org.ksoap2.SoapFault;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;import org.xmlpull.v1.XmlPullParserException;public class WebServiceHelper {private static final String NAMESPACE = "http://dao.simul.com/";// WSDL文档的URL 注意这里要用ip,即使是本机也不能用localhost或者127.0.0.1代替private static final String URL = "http://113.140.93.110:8888/mywebservice/services/mywebservice";// 定义调用的WebService方法名private static final String METHODNAME = "sayHello";public static String sayHello(String str) {String show = null;// 指定WebService的命名空间和调用的方法名利用SoapObject类// 第1个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。// 第2个参数表示要调用的WebService方法名SoapObject request = new SoapObject(NAMESPACE, METHODNAME);// 设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略这一步。设置方法的参数值的代码如下// 要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。request.addProperty("aa", str);// 生成调用WebService方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述// 构造方法设置SOAP协议的版本号:该版本号需要根据服务端WebService的版本号设置// SoapSerializationEnvelope对象后,不要忘了设置SoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第1步创建的SoapObject对象。SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet = false;envelope.setOutputSoapObject(request);//创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URLHttpTransportSE transport = new HttpTransportSE(URL);//transport.debug = true;// web service请求try {//使用call方法调用WebService方法transport.call(NAMESPACE+METHODNAME, envelope);//使用getResponse方法获得WebService方法的返回结果SoapObject result = (SoapObject)envelope.bodyIn;   show=(String)result.getProperty(0).toString(); } catch (SoapFault e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (XmlPullParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}return show;}}

测试的Activity

package com.sunny;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.sunny.R.id;public class Activity01 extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity);Button myButton = (Button)findViewById(id.mButton);final TextView tx=(TextView)findViewById(R.id.myTextView1);myButton.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {String show = WebServiceHelper.sayHello("sunny");tx.setText(show);}});}}

运行程序:



到此开发完成。

其中项目中要注意的地方有几点,陈列如下

1.在AndroidManifest.xml中加入网络访问权限

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

2.要注意url的地址不能为内网ip,必须为公网ip

http://XXX.XXX.XXX.XXX:8888/mywebservice/services/mywebservice(正确)

http://192.168.0.110:8888/mywebservice/services/mywebservice(错误)

3.Xfire的webservice不能加入.wsdl后缀。

基本就是这些,因为android-webservice的访问情况不一。我这里说的是我遇到的问题。就是这么解决的。

如有不能解决的地方,需自己仔细分析原因。


 

原创粉丝点击