客户端调用webservice soap wsdl,soapaction值怎么设置

axis2 客户端调用三种方式 - 光阴迫 - ITeye技术网站
博客分类:
1、wsdl文件:
&?xml version="1.0" encoding="UTF-8" ?&
- &wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://jh.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://jh.com"&
&wsdl:documentation&TestWeb&/wsdl:documentation&
+ &wsdl:types&
- &xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://jh.com"&
- &xs:element name="getName"&
- &xs:complexType&
- &xs:sequence&
&xs:element minOccurs="0" name="name" nillable="true" type="xs:string" /&
&/xs:sequence&
&/xs:complexType&
&/xs:element&
- &xs:element name="getNameResponse"&
- &xs:complexType&
- &xs:sequence&
&xs:element minOccurs="0" name="return" nillable="true" type="xs:string" /&
&/xs:sequence&
&/xs:complexType&
&/xs:element&
&/xs:schema&
&/wsdl:types&
- &wsdl:message name="getNameRequest"&
&wsdl:part name="parameters" element="ns:getName" /&
&/wsdl:message&
- &wsdl:message name="getNameResponse"&
&wsdl:part name="parameters" element="ns:getNameResponse" /&
&/wsdl:message&
- &wsdl:portType name="TestWebPortType"&
- &wsdl:operation name="getName"&
&wsdl:input message="ns:getNameRequest" wsaw:Action="urn:getName" /&
&wsdl:output message="ns:getNameResponse" wsaw:Action="urn:getNameResponse" /&
&/wsdl:operation&
&/wsdl:portType&
+ &wsdl:binding name="TestWebSoap11Binding" type="ns:TestWebPortType"&
&soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /&
- &wsdl:operation name="getName"&
&soap:operation soapAction="urn:getName" style="document" /&
- &wsdl:input&
&soap:body use="literal" /&
&/wsdl:input&
- &wsdl:output&
&soap:body use="literal" /&
&/wsdl:output&
&/wsdl:operation&
&/wsdl:binding&
- &wsdl:binding name="TestWebSoap12Binding" type="ns:TestWebPortType"&
&soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /&
- &wsdl:operation name="getName"&
&soap12:operation soapAction="urn:getName" style="document" /&
+ &wsdl:input&
&soap12:body use="literal" /&
&/wsdl:input&
- &wsdl:output&
&soap12:body use="literal" /&
&/wsdl:output&
&/wsdl:operation&
&/wsdl:binding&
- &wsdl:binding name="TestWebHttpBinding" type="ns:TestWebPortType"&
&http:binding verb="POST" /&
- &wsdl:operation name="getName"&
&http:operation location="getName" /&
- &wsdl:input&
&mime:content type="application/xml" part="parameters" /&
&/wsdl:input&
+ &wsdl:output&
&mime:content type="application/xml" part="parameters" /&
&/wsdl:output&
&/wsdl:operation&
&/wsdl:binding&
- &wsdl:service name="TestWeb"&
- &wsdl:port name="TestWebHttpSoap11Endpoint" binding="ns:TestWebSoap11Binding"&
&soap:address location="http://localhost:9090/axis2/services/TestWeb.TestWebHttpSoap11Endpoint/" /&
&/wsdl:port&
- &wsdl:port name="TestWebHttpSoap12Endpoint" binding="ns:TestWebSoap12Binding"&
&soap12:address location="http://localhost:9090/axis2/services/TestWeb.TestWebHttpSoap12Endpoint/" /&
&/wsdl:port&
- &wsdl:port name="TestWebHttpEndpoint" binding="ns:TestWebHttpBinding"&
&http:address location="http://localhost:9090/axis2/services/TestWeb.TestWebHttpEndpoint/" /&
&/wsdl:port&
&/wsdl:service&
&/wsdl:definitions&
2、java调用方式:
package com.
import java.rmi.RemoteE
import javax.xml.namespace.QN
import org.apache.axiom.om.OMAbstractF
import org.apache.axiom.om.OME
import org.apache.axiom.om.OMF
import org.apache.axiom.om.OMN
import org.apache.axis2.AxisF
import org.apache.axis2.addressing.EndpointR
import org.apache.axis2.client.O
import org.apache.axis2.client.ServiceC
import org.apache.axis2.rpc.client.RPCServiceC
public class Test {
public static void main(String[] args) throws RemoteException {
Test test = new Test();
System.out.println("1
" + test.method1());
System.out.println("2
" + test.method2());
System.out.println("3
" + test.method3());
* 方法一:通过 wsdl2java反向生成的类 调用
* @throws RemoteException
public String method1() throws RemoteException {
TestWeb web = new TestWebStub();
GetName getName = new GetName();
getName.setName("admin ... ");
GetNameResponse res = web.getName(getName);
System.out.println(res.get_return());
return res.get_return();
* 方法二:
* 应用rpc的方式调用 这种方式就等于远程调用,
* 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
* 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
也就是 &wsdl:definitions&元素的targetNamespace属性值。
public String method2() throws AxisFault {
String url = "http://localhost:9090/axis2/services/TestWeb?wsdl";
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
Options options = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
//确定调用方法
options.setAction("urn:getName");
* 指定要调用的getPrice方法及WSDL文件的命名空间
* 如果 webservice 服务端由axis2编写
* 命名空间 不一致导致的问题
* org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
QName qname = new QName("http://jh.com", "getName");
// 指定getPrice方法的参数值
Object[] parameters = new Object[] { "admin... 您终于进来了" };
// 指定getPrice方法返回值的数据类型的Class对象
Class[] returnTypes = new Class[] { String.class };
// 调用方法一 传递参数,调用服务,获取服务返回结果集
OMElement element = serviceClient.invokeBlocking(qname, parameters);
//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
//我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
String result = element.getFirstElement().getText();
System.out.println(result);
* 方法三: 应用document方式调用
* 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
public String method3() {
OMElement result =
// String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
String url = "http://localhost:9090/axis2/services/TestWeb?wsdl";
Options options = new Options();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// options.setAction("urn:getPrice");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
String tns = "http://jh.com";
// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
OMNamespace omNs = fac.createOMNamespace(tns, "");
OMElement method = fac.createOMElement("getName", omNs);
OMElement symbol = fac.createOMElement("name", omNs);
// symbol.setText("1");
symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
method.addChild(symbol);
method.build();
result = sender.sendReceive(method);
System.out.println("*************** " + result);
//&ns:getNameResponse xmlns:ns="http://jh.com"&&ns:return&欢迎您。 Axis2 Echo String &/ns:return&&/ns:getNameResponse&
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
return result + "";
3、输出结果:
欢迎您。 admin ...
欢迎您。 admin ...
欢迎您。 admin... 您终于进来了
欢迎您。 admin... 您终于进来了
*************** &ns:getNameResponse xmlns:ns="http://jh.com"&&ns:return&欢迎您。 Axis2 Echo String &/ns:return&&/ns:getNameResponse&
&ns:getNameResponse xmlns:ns="http://jh.com"&&ns:return&欢迎您。 Axis2 Echo String &/ns:return&&/ns:getNameResponse&
浏览 12731
浏览: 163328 次
来自: 北京
public class Test {
public sta ...
国外有个调研:人临死前最后悔的事情是什么?排在第一位的是:这一 ...
[img][/img][url][/url]
咋啥东东都么有呢?你是那所谓的标题党么!!!webservice客户端调用问题 - ITeye问答
错误信息如下:
Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Server did not recognize the value of HTTP Header SOAPAction: .
org.codehaus.xfire.fault.XFireFault: Server did not recognize the value of HTTP Header SOAPAction: .
网上查了很多文章,都是说服务端namespace的问题,但我们是客户端,我想问下该问题有没可能是客户端代码导致的?如果能确定是服务端问题就只能找服务端开发人员联调了。
问题补充:问题已解决,使用xFire在eclipse上的插件重新生成了客户端代码,自动生成的接口带有注解,如下。注解里指明了targetNamespace,应该是由于这个引起的,把注解去掉再测试就会报Server did not recognize the value of HTTP Header SOAPAction: .
@WebService(name = "IRouteLineService", targetNamespace = "http://tempuri.org/")
public interface IRouteLineService
{
&&& @WebMethod(operationName = "GetTransRouteLine", action = "http://tempuri.org/GetTransRouteLine")
&&& @WebResult(name = "GetTransRouteLineResult", targetNamespace = "http://tempuri.org/")
&&& public String getTransRouteLine(...);
}
zyn010101 写道让那边重新生成客户端试试。
采纳的答案
让那边重新生成客户端试试。
已解决问题
未解决问题webservice在客户端的用法
看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧。此文章采用的项目是我毕业设计的webservice部分。&
首先要建一个web工程和android工程,在此采用myeclipse开发,个人觉得比较方便,要是eclipse安装了tomcat也行。这的web端采用了框架hibernate和spring,因为我的项目只是client端调用web端的数据,没什么web页面,所以就没用struts了。&
讲解前先说说流程:此项目里,在web端里webservice把实体类转换成json的对象通过一个web地址发布出去;(由于WebService
是一种基于SOAP协议的远程调用标准。通过WebService可以将不同操作系统平台,不同语言、不同技术整合到一起,而在Android
SDK中并没有提供调用WebService的库,因此需要使用第三方类库(KSOAP2())来调用WebService
),client端就需要通过发布的地址来获取数据了。&
以下就一步一步来讲解了,所有的代码和流程就以用用户登录来体现了:&
一、Web端&
1、Model和Hibernate配置&
实体类SysUser:
Java代码&&
public&class&SysUser&implements&Serializable&{&&
&&&&private&Long&&&
&&&&private&String&userP&&
&&&&private&String&userP&&
&&&&public&SysUser()&{&&
&&&&public&SysUser(Long&id,&&String&userPwd,&String&userPhone)&{&&
&&&&&&&&super();&&
&&&&&&&&this.id&=&&&
&&&&&&&&this.userPwd&=&userP&&
&&&&&&&&this.userPhone&=&userP&&
&&&&&&&&}&&
&&&&//get和set&&
Hibernate:
Java代码&&
&&&&&&span
class="keyword" style="color: rgb(127, 0, 85); font-weight:
"&class&name=".model.SysUser"&table="SYS_USER"&&&
&&&&&&&&"id"&type="java.lang.Long"&&&
&&&&&&&&&&&&"ID"&precision="22"&scale="0"&/&&&
&&&&&&&&&&&&class="native"&/&&&
&&&&&&&&&&
&&&&&&&&"userPwd"&type="java.lang.String"&&&
&&&&&&&&&&&&"USER_PWD"&length="20"&/&&&
&&&&&&&&&&
&&&&&&&&"userPhone"&type="java.lang.String"&&&
&&&&&&&&&&&&"USER_PHONE"&length="11"&/&&&
&&&&&&&&&&
&&&&&/&span
class="keyword" style="color: rgb(127, 0, 85); font-weight:
"&class&&&
2、PoJo包&
这里面是服务器端返回使用的类,webservice传递数据时,可能只会传递一部分数据,这样的话,就要把要传递的数据封装成一个pojo类,再转成一个json对象,这样的话无论是从代码的整洁、逻辑还是高效,都会是非常完美的写法。在web端和client端的类要完全一样,这样的话更为简单。
Java代码&&
public&class&DataOperateResult&{&&
&&&&private&String&&&
&&&&public&String&getStatus()&{&&
&&&&&&&&return&&&
&&&&public&void&setStatus(String&status)&{&&
&&&&&&&&this.status&=&&&
3、WebService接口&
这里面是封装的webservice接口,手机端就是直接通过这些接口进行数据的传送与接收,最重要的是在接口上一定要加上"@WebService"这个注解,这样才能把此类里面的方法封装成一个webservice接口,关键代码如下:
Java代码&&
//手机客户端服务类(专门负责与手机客户端进行交互)&&
@WebService&&
public&interface&MobileClientService&{&&
&&&&public&String&userLogin(@WebParam(name&=&"opPhone")&String&opPhone,&@WebParam(name&=&"loginPwd")&String&loginPwd);&&
要注意的是方法里的参数前一定要加上@WebParam(name =
"***(随便取的名字)"),这是因为这个opPhone参数通过webservice发布出去之后是以opPhone这个名称存在的,在手机端那边的方法直接获取opPhone就可以了。&
4、WebService接口实现类&
ws里面接口的实现类,在这个类的开始,一定要加上"@WebService(endpointInterface =
".ws.MobileClientService")"这个注解,它表示是继承自.ws.MobileClientService的类,没有这一步,webservice接口是不会实现其功能的。下面是代码:
Java代码&&
@WebService(endpointInterface&=&".ws.MobileClientService")&&
public&class&MobileClientServiceImpl&implements&MobileClientService&{&&
&&&&public&String&userLogin(String&opPhone,&String&loginPwd)&{&&
&&&&&&&&SysUser&sysUser&=&userLoginDao.userLogin(opPhone,&loginPwd);&&
&&&&&&&&DataOperateResult&dataOperateResult&=&new&DataOperateResult();&&
&&&&&&&&if&(sysUser&!=&null)&{&&
&&&&&&&&&&&&//&封装登录验证结果&&
&&&&&&&&&&&&dataOperateResult.setStatus(SUCC);&&
&&&&&&&&&&&&System.out.println("登陆成功!");&&
&&&&&&&&&&&&return&JSONObject.fromObject(dataOperateResult).toString();&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&System.out.println("不存在或手机号码和密码不正确!");&&
&&&&&&&&&&&&dataOperateResult.setStatus(FAIL);&&
&&&&&&&&&&&&return&JSONObject.fromObject(dataOperateResult).toString();&&
&&&&&&&&}&&
5、Dao和Dao实现类
Java代码&&
public&interface&UserLoginDao&{&&
&&&&public&SysUser&userLogin(String&userPhone,&String&passWord);&&
Java代码&&
public&class&UserLoginDaoImpl&extends&BaseDao&implements&UserLoginDao&{&&
&&&&public&SysUser&userLogin(String&userPhone,&String&passWord)&{&&
&&&&&&&&String&sql&=&"&from&SysUser&where&userPhone=?&and&userPwd=?&";&&
&&&&&&&&List&list&=&this.getHibernateTemplate().find(sql,&new&Object[]&{&userPhone,&passWord&});&&
&&&&&&&&if&(list.size()&==&0)&{&&
&&&&&&&&&&&&return&null;&&
&&&&&&&&}&&
&&&&&&&&return&list.get(0);&&
6、Spring配置&
这里spring的配置为了整洁与不臃肿,分成了三部分,分别实现了不同功能:&
applicationContext.xml:所有的spring配置信息,包括连接数据库、配置事务管理器、配置事务传播特性
、dao模板等等
Java代码&&
"dataSource"&class="mons.dbcp.BasicDataSource"&&&
&&&&"driverClassName"&value="com.mysql.jdbc.Driver"&/&&&
&&&&"url"&value="jdbc:mysql://localhost:3306/phonesell"&/&&&
&&&&"username"&value="root"&/&&&
&&&&"password"&value="root"&/&&&
"sessionFactory"&&
&&&&class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&&&
&&&&"dataSource"&&&
&&&&&&&&"dataSource"&/&&&
&&&&"hibernateProperties"&&&
&&&&&&&&&&
&&&&&&&&&&&&"hibernate.dialect"&org.hibernate.dialect.MySQLDialect&&
&&&&&&&&&&&&"hibernate.show_sql"&true&&
&&&&&&&&&&
&&&&"mappingDirectoryLocations"&&&
&&&&&&&&&&
&&&&&&&&&&&&classpath:/com/silent/cn/model/&&
&&&&&&&&&&
"transactionManager"&&
class="org.springframework.orm.hibernate3.HibernateTransactionManager"&&&
&&&&"sessionFactory"&&&
&&&&&&&&"sessionFactory"&/&&&
"txAdvice"&transaction-manager="transactionManager"&&&
&&&&&&&&"save*"&propagation="REQUIRED"&/&&&
&&&&&&&&"delete*"&propagation="REQUIRED"&/&&&
&&&&&&&&"update*"&propagation="REQUIRED"&/&&&
&&&&&&&&"do*"&propagation="REQUIRED"&/&&&
&&&&&&&&"*"&read-only="false"&/&&&
&&&&"allManagerMethod"&&
&&&&&&&&expression="execution(*&.dao.impl.*.*(..))"&/&&&
&&&&"allManagerMethod"&advice-ref="txAdvice"&/&&&
"daoTemplate"&abstract="true"&&&
&&&&"sessionFactory"&ref="sessionFactory"&&&
"jdbcTemplate"&abstract="true"&&&
&&&&"dataSource"&ref="dataSource"&&&
class="keyword" style="color: rgb(127, 0, 85); font-weight:
"&import&resource="applicationContext-webservice.xml"&/&&&
class="keyword" style="color: rgb(127, 0, 85); font-weight:
"&import&resource="applicationContext-dao.xml"&/&&&
7、WebService接口配置&
这里设定的address就是该webservice的实际地址了:
Java代码&&
"clientServiceEndpoint"address="/clientService"&implementorClass=".ws.MobileClientService"&&&
&&&&&&&&&&
&&&&&&&&&&&&"clientService"&class=".ws.impl.MobileClientServiceImpl"&&&
&&&&&&&&&&&&&&&&"userLoginDao"&ref="userLoginDao"&/&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
8、配置web.xml&
在web里添加下面的语句:
Java代码&&
&&&CXFServlet&&
&&&class&org.apache.cxf.transport.servlet.CXFServletclass&&&
&&&&CXFServlet&&
&&&&/ws/*&&
9、WebService接口测试&
最好安装soapUI&
pro这个软件,SOAPUI这个工具功能非常强大,是作为测试工具来用的,它既可以模拟客户端,也可以模拟服务端,可以根据描述文件很容易就生成的模拟的服务端和服务端,还可以有测试用例管理,负荷测试等,对通讯的中间过程也可以全程监控。&
SOAPUI是一个免费的工具,而SOAPUI
PRO是收费的,功能更强大。详细的SOAPUI用法可以参考下面的网址:http://xzhoumin./blog/static//&
首先,我们要获取Web端在Tomcat发布成功之后的接口地址与方法地址,如果是模拟器的话,其IP地址必须是10.0.2.2;如果是真机,那么电脑和真机都要用wifi连接到同一个网段下,而且IP地址就是电脑的实际IP地址,这样手机才能从Tomcat上获取数据,代码如下:
Java代码&&
//WebService接口地址&&
public&static&String&NAME_SPACE_SALE&=&"http://ws./";&&
//&网址(如果是模拟器额话,需要把IP地址&192.168.1.***:8080&换成10.0.2.2:8080)&&
public&static&String&NAME_SPACE&=&"http://10.0.2.2:8080/PhoneSell/";&&
//&连接地址(WebService的方法地址)&&
public&static&String&END_POINT_SALE&=&NAME_SPACE&+&"ws/clientService";&&
然后,我们要写一个通用的WebService接口请求方法,此方法是通用的,只要是通过ksoap与web端交互的都可以使用该方法,代码如下:
Java代码&&
&&&&public&static&SoapObject&common(String&methodName,&HashMap&map,&String&nameSpace,&String&endPoint)&{&&
&&&&&&&&&String&soapAction&=&nameSpace&+&methodN&&
&&&&&&&&&//&指定WebService的命名空间和调用的方法名&&
&&&&&&&&SoapObject&rpc&=&new&SoapObject(nameSpace,&methodName);&&
&&&&&&&&//&设置需调用WebService接口需要传入的参数&&
&&&&&&&&if&(null&!=&map&&&&map.size()&&&0)&{&&
&&&&&&&&&&&&Object[]&key&=&map.keySet().toArray();&&
&&&&&&&&&&&&for&(int&i&=&0;&i&&&key.&i++)&{&&
&&&&&&&&&&&&&&&&rpc.addProperty(key[i].toString(),&map.get(key[i]));&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&//&生成调用WebService方法的SOAP请求信息,并指定SOAP的版本&&
&&&&&&&&SoapSerializationEnvelope&envelope&=&new&SoapSerializationEnvelope(SoapEnvelope.VER11);&&
&&&&&&&&envelope.bodyOut&=&&&
&&&&&&&&//&设置是否调用的是dotNet开发的WebService&&
&&&&&&&&envelope.dotNet&=&false;&&
&&&&&&&&//&设置连接超时时间为20秒&&
&&&&HttpTransportSE&transport&=&new&HttpTransportSE(endPoint,&timeout);&&
&&&&&&&&try&{&&
&&&&&&&&&&&&//&调用WebService&&
&&&&&&&&&&&&transport.call(soapAction,&envelope);&&
&&&&&&&&}&catch&(IOException&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(XmlPullParserException&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&//&获取返回的数据&&
&&&&&&&&SoapObject&soapObject&=&(SoapObject)&envelope.bodyIn;&&
&&&&&&&&return&soapO&&
接着,就是写各种webservice数据交互的方法了,基本上都是封装成一个json对象再以字符串形式传递,这里是用户登录方法:
Java代码&&
public&static&String&verifyUser(Context&context,&String&userPhone,&String&userPwd)&&&&&&{&&
&&&&&&&&//&设置调用接口需要传递的参数名称、值&&
&&&&&&&&HashMap&paramMap&=&new&HashMap();&&
&&&&&&&&paramMap.put("opPhone",&userPhone);&&
&&&&&&&&paramMap.put("loginPwd",&userPwd);&&
&&&&&&&&try&{&&
&&&&&&&&&&&&//&调用接口&&
&&&&&&&&&&&&SoapObject&soapObject&=&common("userLogin",&paramMap,&NAME_SPACE_SALE,&END_POINT_SALE);&&
&&&&&&&&&&&&return&soapObject.getProperty(0).toString();&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&return&null;&&
&&&&&&&&}&&
注:hashmap里的key就是web端webservice接口里的@WebParam(name =
"opPhone"),此字符串一定要匹配。
一篇不错的文章,转自:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。WebService的用法 - 白强 - ITeye技术网站
博客分类:
看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧。此文章采用的项目是我毕业设计的webservice部分。 首先要建一个web工程和android工程,在此采用myeclipse开发,个人觉得比较方便,要是eclipse安装了tomcat也行。这的web端采用了框架hibernate和spring,因为我的项目只是client端调用web端的数据,没什么web页面,所以就没用struts了。 讲解前先说说流程:此项目里,在web端里webservice把实体类转换成json的对象通过一个web地址发布出去;(由于WebService 是一种基于SOAP协议的远程调用标准。通过WebService可以将不同操作系统平台,不同语言、不同技术整合到一起,而在Android SDK中并没有提供调用WebService的库,因此需要使用第三方类库(KSOAP2)来调用WebService ),client端就需要通过发布的地址来获取数据了。 以下就一步一步来讲解了,所有的代码和流程就以用用户登录来体现了: 一、Web端 1、Model和Hibernate配置 实体类SysUser:
public class SysUser implements Serializable {
private String userP
private String userP
public SysUser() {
public SysUser(Long id,
String userPwd, String userPhone) {
this.userPwd = userP
this.userPhone = userP
public class SysUser implements Serializable {
private String userP
private String userP
public SysUser() {
public SysUser(Long id,
String userPwd, String userPhone) {
this.userPwd = userP
this.userPhone = userP
//get和set
Hibernate:
&hibernate-mapping&
&class name=".model.SysUser" table="SYS_USER"&
&id name="id" type="java.lang.Long"&
&column name="ID" precision="22" scale="0" /&
&generator class="native" /&
&property name="userPwd" type="java.lang.String"&
&column name="USER_PWD" length="20" /&
&/property&
&property name="userPhone" type="java.lang.String"&
&column name="USER_PHONE" length="11" /&
&/property&
&/hibernate-mapping&
&hibernate-mapping&
&class name=".model.SysUser" table="SYS_USER"&
&id name="id" type="java.lang.Long"&
&column name="ID" precision="22" scale="0" /&
&generator class="native" /&
&property name="userPwd" type="java.lang.String"&
&column name="USER_PWD" length="20" /&
&/property&
&property name="userPhone" type="java.lang.String"&
&column name="USER_PHONE" length="11" /&
&/property&
&/hibernate-mapping&
2、PoJo包 这里面是服务器端返回使用的类,webservice传递数据时,可能只会传递一部分数据,这样的话,就要把要传递的数据封装成一个pojo类,再转成一个json对象,这样的话无论是从代码的整洁、逻辑还是高效,都会是非常完美的写法。在web端和client端的类要完全一样,这样的话更为简单。
public class DataOperateResult {
public String getStatus() {
public void setStatus(String status) {
this.status =
* 登陆状态
public class DataOperateResult {
public String getStatus() {
public void setStatus(String status) {
this.status =
3、WebService接口
这里面是封装的webservice接口,手机端就是直接通过这些接口进行数据的传送与接收,最重要的是在接口上一定要加上"@WebService"这个注解,这样才能把此类里面的方法封装成一个webservice接口,关键代码如下:
@WebService
public interface MobileClientService {
public String userLogin(@WebParam(name = "opPhone") String opPhone, @WebParam(name = "loginPwd") String loginPwd);
//手机客户端服务类(专门负责与手机客户端进行交互)
@WebService
public interface MobileClientService {
* @param opPhone
* @param loginPwd
public String userLogin(@WebParam(name = "opPhone") String opPhone, @WebParam(name = "loginPwd") String loginPwd);
要注意的是方法里的参数前一定要加上@WebParam(name = "***(随便取的名字)"),这是因为这个opPhone参数通过webservice发布出去之后是以opPhone这个名称存在的,在手机端那边的方法直接获取opPhone就可以了。 4、WebService接口实现类 ws里面接口的实现类,在这个类的开始,一定要加上"@WebService(endpointInterface = ".ws.MobileClientService")"这个注解,它表示是继承自.ws.MobileClientService的类,没有这一步,webservice接口是不会实现其功能的。下面是代码:
@WebService(endpointInterface = ".ws.MobileClientService")
public class MobileClientServiceImpl implements MobileClientService {
public String userLogin(String opPhone, String loginPwd) {
SysUser sysUser = userLoginDao.userLogin(opPhone, loginPwd);
DataOperateResult dataOperateResult = new DataOperateResult();
if (sysUser != null) {
dataOperateResult.setStatus(SUCC);
System.out.println("登陆成功!");
return JSONObject.fromObject(dataOperateResult).toString();
System.out.println("不存在或手机号码和密码不正确!");
dataOperateResult.setStatus(FAIL);
return JSONObject.fromObject(dataOperateResult).toString();
@WebService(endpointInterface = ".ws.MobileClientService")
public class MobileClientServiceImpl implements MobileClientService {
public String userLogin(String opPhone, String loginPwd) {
SysUser sysUser = userLoginDao.userLogin(opPhone, loginPwd);
DataOperateResult dataOperateResult = new DataOperateResult();
if (sysUser != null) {
// 封装登录验证结果
dataOperateResult.setStatus(SUCC);
System.out.println("登陆成功!");
return JSONObject.fromObject(dataOperateResult).toString();
System.out.println("不存在或手机号码和密码不正确!");
dataOperateResult.setStatus(FAIL);
return JSONObject.fromObject(dataOperateResult).toString();
5、Dao和Dao实现类
public interface UserLoginDao {
public SysUser userLogin(String userPhone, String passWord);
* 用户登录DAO
public interface UserLoginDao {
* 根据用户名和用户密码登陆
* @param userPhone 用户手机号码
* @param passWord 用户密码
public SysUser userLogin(String userPhone, String passWord);
public class UserLoginDaoImpl extends BaseDao implements UserLoginDao {
public SysUser userLogin(String userPhone, String passWord) {
String sql = " from SysUser where userPhone=? and userPwd=? ";
List&SysUser& list = this.getHibernateTemplate().find(sql, new Object[] { userPhone, passWord });
if (list.size() == 0) {
return null;
return list.get(0);
* 用户登录DAO实现类
public class UserLoginDaoImpl extends BaseDao implements UserLoginDao {
public SysUser userLogin(String userPhone, String passWord) {
String sql = " from SysUser where userPhone=? and userPwd=? ";
List&SysUser& list = this.getHibernateTemplate().find(sql, new Object[] { userPhone, passWord });
if (list.size() == 0) {
return list.get(0);
6、Spring配置
这里spring的配置为了整洁与不臃肿,分成了三部分,分别实现了不同功能: applicationContext.xml:所有的spring配置信息,包括连接数据库、配置事务管理器、配置事务传播特性 、dao模板等等
&bean id="dataSource" class="mons.dbcp.BasicDataSource"&
&property name="driverClassName" value="com.mysql.jdbc.Driver" /&
&property name="url" value="jdbc:mysql://localhost:3306/phonesell" /&
&property name="username" value="root" /&
&property name="password" value="root" /&
&bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource"&
&ref bean="dataSource" /&
&/property&
&property name="hibernateProperties"&
&prop key="hibernate.dialect"&org.hibernate.dialect.MySQLDialect&/prop&
&prop key="hibernate.show_sql"&true&/prop&
&/property&
&!-- 实体类资源映射 --&
&property name="mappingDirectoryLocations"&
&value&classpath:/com/silent/cn/model/&/value&
&/property&
&!-- 配置事务管理器 --&
&bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"&
&property name="sessionFactory"&
&ref bean="sessionFactory" /&
&/property&
&!-- 配置事务传播特性 --&
&tx:advice id="txAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="save*" propagation="REQUIRED" /&
&tx:method name="delete*" propagation="REQUIRED" /&
&tx:method name="update*" propagation="REQUIRED" /&
&tx:method name="do*" propagation="REQUIRED" /&
&tx:method name="*" read-only="false" /&
&/tx:attributes&
&/tx:advice&
&!-- 哪些类的哪些方法参与事务 --&
&aop:config&
&aop:pointcut id="allManagerMethod"
expression="execution(* .dao.impl.*.*(..))" /&
&aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" /&
&/aop:config&
&!-- dao模板(所有dao都将使用此模板) --&
&bean id="daoTemplate" abstract="true"&
&property name="sessionFactory" ref="sessionFactory"&&/property&
&bean id="jdbcTemplate" abstract="true"&
&property name="dataSource" ref="dataSource"&&/property&
&!--WebService配置--&
&import resource="applicationContext-webservice.xml" /&
&import resource="applicationContext-dao.xml" /&
&bean id="dataSource" class="mons.dbcp.BasicDataSource"&
&property name="driverClassName" value="com.mysql.jdbc.Driver" /&
&property name="url" value="jdbc:mysql://localhost:3306/phonesell" /&
&property name="username" value="root" /&
&property name="password" value="root" /&
&bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource"&
&ref bean="dataSource" /&
&/property&
&property name="hibernateProperties"&
&prop key="hibernate.dialect"&org.hibernate.dialect.MySQLDialect&/prop&
&prop key="hibernate.show_sql"&true&/prop&
&/property&
&!-- 实体类资源映射 --&
&property name="mappingDirectoryLocations"&
&value&classpath:/com/silent/cn/model/&/value&
&/property&
&!-- 配置事务管理器 --&
&bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"&
&property name="sessionFactory"&
&ref bean="sessionFactory" /&
&/property&
&!-- 配置事务传播特性 --&
&tx:advice id="txAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="save*" propagation="REQUIRED" /&
&tx:method name="delete*" propagation="REQUIRED" /&
&tx:method name="update*" propagation="REQUIRED" /&
&tx:method name="do*" propagation="REQUIRED" /&
&tx:method name="*" read-only="false" /&
&/tx:attributes&
&/tx:advice&
&!-- 哪些类的哪些方法参与事务 --&
&aop:config&
&aop:pointcut id="allManagerMethod"
expression="execution(* .dao.impl.*.*(..))" /&
&aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" /&
&/aop:config&
&!-- dao模板(所有dao都将使用此模板) --&
&bean id="daoTemplate" abstract="true"&
&property name="sessionFactory" ref="sessionFactory"&&/property&
&bean id="jdbcTemplate" abstract="true"&
&property name="dataSource" ref="dataSource"&&/property&
&!--WebService配置--&
&import resource="applicationContext-webservice.xml" /&
&import resource="applicationContext-dao.xml" /&
7、WebService接口配置 这里设定的address就是该webservice的实际地址了:
配置WebService接口 http:
&jaxws:endpointid="clientServiceEndpoint"address="/clientService" implementorClass=".ws.MobileClientService"&
&jaxws:implementor&
&bean id="clientService" class=".ws.impl.MobileClientServiceImpl"&
&property name="userLoginDao" ref="userLoginDao" /&
&/jaxws:implementor&
&/jaxws:endpoint&
配置WebService接口 http://localhost:8080/PhoneSell/ws/clientService?wsdl
&jaxws:endpointid="clientServiceEndpoint"address="/clientService" implementorClass=".ws.MobileClientService"&
&jaxws:implementor&
&bean id="clientService" class=".ws.impl.MobileClientServiceImpl"&
&property name="userLoginDao" ref="userLoginDao" /&
&/jaxws:implementor&
&/jaxws:endpoint&
8、配置web.xml 在web里添加下面的语句:
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/ws/*&/url-pattern&
&/servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/ws/*&/url-pattern&
&/servlet-mapping&
9、WebService接口测试
最好安装soapUI
pro这个软件,SOAPUI这个工具功能非常强大,是作为测试工具来用的,它既可以模拟客户端,也可以模拟服务端,可以根据描述文件很容易就生成的模拟的服务端和服务端,还可以有测试用例管理,负荷测试等,对通讯的中间过程也可以全程监控。 SOAPUI是一个免费的工具,而SOAPUI PRO是收费的,功能更强大。详细的SOAPUI用法可以参考下面的网址:http://xzhoumin./blog/static// Client端 1、 首先,我们要获取Web端在Tomcat发布成功之后的接口地址与方法地址,如果是模拟器的话,其IP地址必须是10.0.2.2;如果是真机,那么电脑和真机都要用wifi连接到同一个网段下,而且IP地址就是电脑的实际IP地址,这样手机才能从Tomcat上获取数据,代码如下:
public static String NAME_SPACE_SALE = "http://ws./";
public static String NAME_SPACE = "http://10.0.2.2:8080/PhoneSell/";
public static String END_POINT_SALE = NAME_SPACE + "ws/clientService";
//WebService接口地址
public static String NAME_SPACE_SALE = "http://ws./";
// 网址(如果是模拟器额话,需要把IP地址&192.168.1.***:8080&换成10.0.2.2:8080)
public static String NAME_SPACE = "http://10.0.2.2:8080/PhoneSell/";
// 连接地址(WebService的方法地址)
public static String END_POINT_SALE = NAME_SPACE + "ws/clientService";
2、 然后,我们要写一个通用的WebService接口请求方法,此方法是通用的,只要是通过ksoap与web端交互的都可以使用该方法,代码如下:
public static SoapObject common(String methodName, HashMap&String, Object& map, String nameSpace, String endPoint) {
String soapAction = nameSpace + methodN
SoapObject rpc = new SoapObject(nameSpace, methodName);
if (null != map && map.size() & 0) {
Object[] key = map.keySet().toArray();
for (int i = 0; i & key. i++) {
rpc.addProperty(key[i].toString(), map.get(key[i]));
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
envelope.dotNet = false;
HttpTransportSE transport = new HttpTransportSE(endPoint, timeout);
transport.call(soapAction, envelope);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
SoapObject soapObject = (SoapObject) envelope.bodyIn;
return soapO
public static SoapObject common(String methodName, HashMap&String, Object& map, String nameSpace, String endPoint) {
String soapAction = nameSpace + methodN
// 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(nameSpace, methodName);
// 设置需调用WebService接口需要传入的参数
if (null != map && map.size() & 0) {
Object[] key = map.keySet().toArray();
for (int i = 0; i & key. i++) {
rpc.addProperty(key[i].toString(), map.get(key[i]));
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet =
// 设置连接超时时间为20秒
HttpTransportSE transport = new HttpTransportSE(endPoint, timeout);
// 调用WebService
transport.call(soapAction, envelope);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
// 获取返回的数据
SoapObject soapObject = (SoapObject) envelope.bodyIn;
return soapO
接着,就是写各种webservice数据交互的方法了,基本上都是封装成一个json对象再以字符串形式传递,这里是用户登录方法:
public static String verifyUser(Context context, String userPhone, String userPwd)
HashMap&String, Object& paramMap = new HashMap&String, Object&();
paramMap.put("opPhone", userPhone);
paramMap.put("loginPwd", userPwd);
SoapObject soapObject = common("userLogin", paramMap, NAME_SPACE_SALE, END_POINT_SALE);
return soapObject.getProperty(0).toString();
} catch (Exception e) {
return null;
public static String verifyUser(Context context, String userPhone, String userPwd)
// 设置调用接口需要传递的参数名称、值
HashMap&String, Object& paramMap = new HashMap&String, Object&();
paramMap.put("opPhone", userPhone);
paramMap.put("loginPwd", userPwd);
// 调用接口
SoapObject soapObject = common("userLogin", paramMap, NAME_SPACE_SALE, END_POINT_SALE);
return soapObject.getProperty(0).toString();
} catch (Exception e) {
注:hashmap里的key就是web端webservice接口里的@WebParam(name = "opPhone"),此字符串一定要匹配。
浏览: 408106 次
UfgovDBUtil 是什么类
帮大忙了,非常感谢
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
你再客户端搞这么多拦截器干什么}

我要回帖

更多关于 webservice soap wsdl 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信