webservice五种发布方式与客户端调用_第1页
webservice五种发布方式与客户端调用_第2页
webservice五种发布方式与客户端调用_第3页
webservice五种发布方式与客户端调用_第4页
webservice五种发布方式与客户端调用_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...WebService四种发布方式总结Author:yczhangCXF方式CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar〞报错,报的错为:java.lang.IncompatibleClassChangeError,明显的jar包不兼容问题,很是头痛,后来查找资料找到解决方法是,将上述jar包新建一个was共享库,可以解决,但是客户周经理不想用此种方式,因为需要修改was,于是改用了axis2方式,下文会介绍。该问题在此处做个记录,以后使用cxf与was的时候需要注意!!!使用cxf+spring搭建WebService:第一步,添加jar包。此处需要注意,不同环境〔tomcat、was〕jar也不一定一样,例如我本地cxf+spring只需要如下jar包:而泰康的was环境则需要如下jar包:明显的多了很多,原因应该是服务器jar包池的不同。根据错误提示缺什么补什么就可以了,注意jar包勿重复。第二步,配置web.xml文件,如下〔重要的地方已标记〕:<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/applicationContext.xml</param-value> </context-param> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--CharacterEncodingfilter--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/webservice/*</url-pattern></servlet-mapping>上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;第三步,编写接口类与实现类,注意注解接口类@WebServicepublicinterfaceSendService{ publicbooleansendOA(@WebParam(name="param")Stringparam); publicbooleansendOrg(OrgEntityorg);}实现类@WebService(endpointInterface="com.service.SendService",serviceName="sendService")publicclassSendServiceImplimplementsSendService{ publicbooleansendOA(Stringparam){ System.out.println("-------sendOA---------param:"+param); if(param.equals("zhoujian")){ returntrue; } returnfalse; } publicbooleansendOrg(OrgEntityorg){ System.out.println("-------sendOrg--begin-------"); returntrue; }}第四步,Spring配置文件<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns=":///schema/beans" xmlns:xsi=":///2001/XMLSchema-instance" xmlns:p=":///schema/p" xmlns:jaxws=":///jaxws"xsi:schemaLocation=" :///schema/beans :///schema/beans/spring-beans.xsd :///jaxws :///schemas/jaxws.xsd"> <importresource="classpath:META-INF/cxf/cxf.xml"/> <importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/> <jaxws:endpointid="sendServie"implementor="com.service.impl.SendServiceImpl" address="/sendServie"/> <!--<jaxws:clientid="sendServiceClient"serviceClass="com.service.SendService" address="://1:9080/Wb/webservice/sendServie?wsdl"/>--></beans>“jaxws:client〞该标签可以不必写,访问时可以手动拼接该url第五步,发布,直接部署到服务器,访问:://1:9080/Wb/webservice/sendServie?wsdlXfire方式据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。Xfire方式发布webservice:第一步,添加jar包,如下:第二步,修改web.xml文件<servlet><servlet-name>XFireServlet</servlet-name><servlet-class>org.codehaus.xfire.transport..XFireConfigurableServlet</servlet-class><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>XFireServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping>第三步,编写接口类接口类:publicabstractinterfaceIBankingService{ publicabstractStringtransferFunds(StringparamString1);}实现类:publicclassBankingServiceimplementsIBankingService{publicStringtransferFunds(StringfromAccount){returnfromAccount+":ok";}}第四步,编写services.xml配置文件在WEB-INF目录下新建目录META-INF,在该目录下新建文件夹xfire,该目录下新建文件services.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns=":///config/1.0"> <service> <name>Banking</name> <namespace>mybank</namespace> <serviceClass> com.mybank.xfire.example.IBankingService </serviceClass> <implementationClass> com.mybank.xfire.impl.BankingService </implementationClass> </service></beans>第五步,发布,部署到服务器,访问url:://localhost:9080/Xfire/services/Banking?wsdlAXIS2方式Axis2发布WebService有两种方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服务器发布;其二是不打包发布〔本例〕;我不清楚打包发布有什么好处,感觉很麻烦工程外还得部署一个war,现在介绍第二种不打包的方式,类似xfire,同时由于cxf与was不兼容导致wsdl.jar报错,但是xfire与axis2也用到wsdl.jar却不报错,我个人也是很费解,泰康工程目前使用的就是axis2方式。Axis2发布WebService:第一步,添加jar包,如下:很多是吧,不过都是从axis.war里面WEB-INF下的lib目录复制来的。第二步,修改web.xml文件<servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis2.transport..AxisServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping>第三步,编写实现类publicclassServiceImpl{ publicStringsayHello(Stringname){ System.out.println("================"); return"hello:"+name; }}第四步,增加WEN-INF内容将axis.war解压下的WEN-INF文件夹内的conf、modules复制到工程WEB-INF下第五步,在WEB-INF下创立文件夹services〔名字不可改〕,在该目录下创立文件夹〔名称随意〕,在该目录下创立文件夹META-INF〔名称不可改〕,在该目录下创立文件services.xml〔名称不可改〕,该文件内容为:<?xmlversion="1.0"encoding="UTF-8"?><servicename="axisDemo"><description>WebService例子</description><parametername="ServiceClass">com.ServiceImpl</parameter><messageReceivers><messageReceivermep=":///2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/><messageReceivermep=":///2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/></messageReceivers></service>第六步,部署到服务器,发布URL为:://localhost:9080/Axis2Test/services/axisDemo?wsdlAXIS1方式同上,不知道AXIS1哪里不好,配置也很简单,如下:第一步,添加jar包第二步,修改web.xml<servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis.transport..AxisServlet</servlet-class></servlet><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping>第三步,实现类与实体类实现类:packagecom;publicclassAxis{ publicStringsayHello(Stringname){ System.out.println("============:"+name); return"hi:"+name; } publicStringsayHelloToUser(Useru){ System.out.println("============:"+u.getId()); System.out.println("============:"+u.getPath()); System.out.println("============:"+u.getAdd()); return"hi:"+u.getName(); }}实体类:packagecom;publicclassUser{ privateStringid; privateStringname; privateStringadd; privateStringpath;gettersetter……方法第四步,创立配置文件:在WEB-INF下新建文件“server-config.wsdd〞<?xmlversion="1.0"encoding="UTF-8"?><deploymentxmlns=":///axis/wsdd/"xmlns:java=":///axis/wsdd/providers/java"><!--globalConfiguration标签内容为系统默认无需更改<globalConfiguration><parametername="adminPassword"value="admin"/><parametername="attachments.Directory"value="./attachments"/><parametername="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl"/><parametername="sendXsiTypes"value="true"/><parametername="sendMultiRefs"value="true"/><parametername="sendXMLDeclaration"value="true"/><parametername="axis.sendMinimizedElements"value="true"/><requestFlow><handlertype="java:org.apache.axis.handlers.JWSHandler"><parametername="scope"value="session"/></handler><handlertype="java:org.apache.axis.handlers.JWSHandler"><parametername="scope"value="request"/><parametername="extension"value=".jwr"/></handler></requestFlow></globalConfiguration><handlername="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder"/><handlername="URLMapper"type="java:org.apache.axis.handlers..URLMapper"/><handlername="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/><!—service标签是需要配置的-<!—name是url中需要的参数-<servicename="axisTest"provider="java:RPC"><!—allowedMethods的value值是方法名可以写*-<parametername="allowedMethods"value="*"/><!—className的value值是类路径-<parametername="className"value="com.Axis"/><!—wsdlTargetNamespace的wsdl文件中TargetNamespace的值-<parametername="wsdlTargetNamespace"value="://service.impl.tdi.taikang.tivoli.ibm/"/><!—此处很重要,假设方法需要传实体类,则配置此处-<beanMappingqname="myNS:User"xmlns:myNS="urn:BeanService"languageSpecificType="java:com.User"/></service><!—默认-<transportname=""><requestFlow><handlertype="URLMapper"/><handlertype="java:org.apache.axis.handlers..AuthHandler"/></requestFlow></transport><transportname="local"><responseFlow><handlertype="LocalResponder"/></responseFlow></transport></deployment>第五步,部署,同上。CLIENT方式cilent属于一种比拟简单的实现方式我们将WebService发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该WebService,常用的有两种:1、通过浏览器调用,返回标准的XML文件内容

2、通过客户端程序调用,返回结果可自定义格式

接下来,我利用Eclipse作为开发工具,演示一个client调用WebService的简单例如步骤如下:准备工作:用到的jar包有:下载链接〔:///detail/lanxuezaipiao/5354480〕第一步:新建JavaProject,工程名称为CallWebService第二步:将所需jar包导入到库中第三步:编写调用class,这里有两种方式调用,即GET方式和POST方式,由于POST方式较安全,故这里采用POST方式调用;请求数据的构造也有两种方式:静态和动态构造,下面分别介绍这两种方式:注:这里以E邮宝开放的webservice接口为例调用其中一个API函数,而E邮宝的webservice基于SOAP,故请求数据为SOAP格式,大家可根据自己情况进展修改。静态构造请求数据:packagecom.;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importorg.apachemons.client.Client;importorg.apachemons.client.Exception;importorg.apachemons.client.methods.InputStreamRequestEntity;importorg.apachemons.client.methods.PostMethod;importorg.apachemons.client.methods.RequestEntity;publicclassStaticclientCall{/***@paramargs*@throwsIOException*@throwsException*/publicstaticvoidmain(String[]args)throwsException,IOException{//TODOAuto-generatedmethodstubStringsoapRequestData="<?xmlversion=\"1.0\"encoding=\"utf-8\"?>"+"<soap12:Envelopexmlns:xsi=\":///2001/XMLSchema-instance\""+"xmlns:xsd=\":///2001/XMLSchema\""+"xmlns:soap12=\":///2003/05/soap-envelope\">"+"<soap12:Body>"+"<GetAPACShippingPackagexmlns=\":///\">"+"<GetAPACShippingPackageRequest>"+"<TrackCode>123</TrackCode>"+"<Version>123</Version>"+"<APIDevUserID>123</APIDevUserID>"+"<APIPassword>123</APIPassword>"+"<APISellerUserID>123</APISellerUserID>"+"<MessageID>123</MessageID>"+"</GetAPACShippingPackageRequest>"+"</GetAPACShippingPackage>"+"</soap12:Body>"+"</soap12:Envelope>";System.out.println(soapRequestData);PostMethodpostMethod=newPostMethod(":///v3/orderservice.asmx?wsdl");//然后把Soap请求数据添加到PostMethod中byte[]b=soapRequestData.getBytes("utf-8");InputStreamis=newByteArrayInputStream(b,0,b.length);RequestEntityre=newInputStreamRequestEntity(is,b.length,"application/soap+xml;charset=utf-8");postMethod.setRequestEntity(re);//最后生成一个Client对象,并发出postMethod请求ClientClient=newClient();intstatusCode=Client.executeMethod(postMethod);if(statusCode==200){System.out.println("调用成功!");StringsoapResponseData=postMethod.getResponseBodyAsString();System.out.println(soapResponseData);}else{System.out.println("调用失败!错误码:"+statusCode);}}}动态构造数据:packagecom.;importjava.io.ByteArrayInputStream;importjava.io.InputStream;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;importorg.apachemons.client.Client;importorg.apachemons.client.methods.InputStreamRequestEntity;importorg.apachemons.client.methods.PostMethod;importorg.apachemons.client.methods.RequestEntity;//动态构造调用串,灵活性更大publicclassDynamicclientCall{privateStringnamespace;privateStringmethodName;privateStringwsdlLocation;privateStringsoapResponseData;publicDynamicclientCall(Stringnamespace,StringmethodName,StringwsdlLocation){space=namespace;this.methodName=methodName;this.wsdlLocation=wsdlLocation;}privateintinvoke(Map<String,String>patameterMap)throwsException{PostMethodpostMethod=newPostMethod(wsdlLocation);StringsoapRequestData=buildRequestData(patameterMap);byte[]bytes=soapRequestData.getBytes("utf-8");InputStreaminputStream=newByteArrayInputStream(bytes,0,bytes.length);RequestEntityrequestEntity=newInputStreamRequestEntity(inputStream,bytes.length,"application/soap+xml;charset=utf-8");postMethod.setRequestEntity(requestEntity);ClientClient=newClient();intstatusCode=Client.executeMethod(postMethod);soapResponseData=postMethod.getResponseBodyAsString();returnstatusCode;}privateStringbuildRequestData(Map<String,String>patameterMap){StringBuffersoapRequestData=newStringBuffer();soapRequestData.append("<?xmlversion=\"1.0\"encoding=\"utf-8\"?>");soapRequestData.append("<soap12:Envelopexmlns:xsi=\":///2001/XMLSchema-instance\""+"xmlns:xsd=\":///2001/XMLSchema\""+"xmlns:soap12=\":///2003/05/soap-envelope\">");soapRequestData.append("<soap12:Body>");soapRequestData.append("<"+methodName+"xmlns=\""+namespace+"\">");soapRequestData.append("<"+methodName+"Request>");Set<String>nameSet=patameterMap.keySet();for(Stringname:nameSet){soapRequestData.append("<"+name+">"+patameterMap.get(name)+"</"+name+">");}soapRequestData.append("</"+methodName+"Request>");soapRequestData.append("</"+methodName+">");soapRequestData.append("</soap12:Body>");soapRequestData.append("</soap12:Envelope>");returnsoapRequestData.toString();}/***@paramargs*@throwsException*/publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstubDynamicclientCalldynamicclientCall=newDynamicclientCall(":///","GetAPACShippingPackage",":///v3/orderservice.asmx?wsdl");Map<String,String>patameterMap=newHashMap<String,String>();patameterMap.put("TrackCode","123");patameterMap.put("Version","123");patameterMap.put("APIDevUserID","123");patameterMap.put("APIPassword","123");patameterMap.put("APISellerUserID","123");patameterMap.put("MessageID","123");patameterMap.put("TrackCode","123");StringsoapRequestData=dynamicclientCall.buildRequestData(patameterMap);System.out.println(soapRequestData);intstatusCode=dynamicclientCall.invoke(patameterMap);if(statusCode==200){System.out.println("调用成功!");System.out.println(dynamicclientCall.soapResponseData);}else{System.out.println("调用失败!错误码:"+statusCode);}}}最终运行结果:可见最终返回的也是xml格式的数据,这里数据未进展格式化显示和处理AXIS1客户端调用此处调用方式为axis1的调用,需要传递的参数可以是字符串或实体类,字符串方式:Serviceservice=newService();Callcall=(Call)service.createCall();//wsdl地址call.setTargetEndpointAddress(newURL(wsdlUrl));//设定调用3分钟不返回则超时call.setTimeout(newInteger(180000)); //命名空间(wsdl文件中的targetNameSpace属性值)以及方法名call.setOperationName(newQName("://com","sayHello"));//参数类型call.addParameter("name",XMLType.XSD_STRING,ParameterMode.IN);//返回值类型call.setReturnType(XMLType.XSD_STRING);//参数值StringretXML2=(String)call.invoke(newObject[]{"yczhang"});System.out.println(retXML2);实体类方式〔调用axis2的接口有点问题〕:UserEntityuserEntry=newUserEntity();userEntry.setId("yczhang");userEntry.setName("yczhang");Serviceservice=newService();Callcall=(Call)service.createCall();//wsdl地址call.setTargetEndpointAddress(newURL(wsdlUrl));//设定调用3分钟不返回则超时call.setTimeout(newInteger(180000)); //命名空间(wsdl文件中的targetNameSpace属性值)以及方法名call.setOperationName(newQName("://com","sayHelloToUser"));//注册SimpleObject的序列化类型QNameqn=newQName("urn:BeanService","UserEntity");call.registerTypeMapping(UserEntity.class,qn,newBeanSerializerFactory(UserEntity.class,qn),newBeanDeserializerFactory(UserEntity.class,qn));//参数类型〔可省略〕call.addParameter("requestParam",org.apache.axis.encoding.XMLType.XSD_ANYTYPE,ParameterMode.IN);//返回值类型call.setReturnType(XMLType.XSD_BOOLEAN);BooleanretXML1=(Boolean)call.invoke(newObject[]{userEntry});System.out.println(retXML1);注意,实体类方式,当调用的是由axis2方式所发布的接口时,容易出现问题,表现在所传递的实体类的属性内容为null,但在该实体类内新建一属性传如该值时,却有值。应该是axis1对axis2的不兼容问题。并且调用axis2的接口时,需要在客户端写出namespace,即://call.setOperationName(newQName("://localhost:9080/WS_Axis/services/axisTest","sayHelloToUser"));该种调用方式对于axis1的接口没问题。泰康工程最终使用的是axis1发布的接口,并使用该种方式调用的。publicstaticvoidmain(String[]args)throwsServiceException,MalformedURLException,RemoteException{ StringwsdlUrl="://localhost:9080/WS_Axis/services/axisTest?wsdl"; //实体类Useruser=newUser(); user.setId("1"); user.setAdd("test"); user.setName("test"); user.setPath("test"); Serviceservice=newService(); Callcall=(Call)service.createCall(); call.setTargetEndpointAddress(newURL(wsdlUrl));//设定调用3分钟不返回则超时 call.setTimeout(newInteger(180000)); //call.setOperationName(newQName("://localhost:9080/WS_Axis/services/axisTest","sayHelloToUser")); //注册SimpleObject的序列化类型〔urn:BeanService在wsdd文件内有配置〕 QNameqn=newQName("urn:BeanService","User"); call.registerTypeMapping(User.class,qn,newBeanSerializerFactory(User.class,qn),newBeanDeserializerFactory(User.class,qn));//方法名 call.setOperationName("sayHelloToUser");//“user〞是接口服务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论