webservice五種發(fā)布方式與客戶端調用_第1頁
webservice五種發(fā)布方式與客戶端調用_第2頁
webservice五種發(fā)布方式與客戶端調用_第3頁
webservice五種發(fā)布方式與客戶端調用_第4頁
webservice五種發(fā)布方式與客戶端調用_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

...wd......wd......wd...WebService四種發(fā)布方式總結Author:yczhangCXF方式CXF與spring搭建webservice是目前最流行的方式,但是傳聞cxf與jdk1.5有些不兼容,我沒有遇到過,我遇到的問題是cxf與was6.1.1不兼容,表現(xiàn)在cxf必須的jar包“wsdl4j-1.6.2.jar〞報錯,報的錯為:java.lang.IncompatibleClassChangeError,明顯的jar包不兼容問題,很是頭痛,后來查找資料找到解決方法是,將上述jar包新建一個was共享庫,可以解決,但是客戶周經理不想用此種方式,因為需要修改was,于是改用了axis2方式,下文會介紹。該問題在此處做個記錄,以后使用cxf與was的時候需要注意?。?!使用cxf+spring搭建WebService:第一步,添加jar包。此處需要注意,不同環(huán)境〔tomcat、was〕jar也不一定一樣,例如我本地cxf+spring只需要如下jar包:而泰康的was環(huán)境則需要如下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地址內容;第三步,編寫接口類與實現(xiàn)類,注意注解接口類@WebServicepublicinterfaceSendService{ publicbooleansendOA(@WebParam(name="param")Stringparam); publicbooleansendOrg(OrgEntityorg);}實現(xiàn)類@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第五步,發(fā)布,直接部署到服務器,訪問:://1:9080/Wb/webservice/sendServie?wsdlXfire方式據說xfire方式已經很老了,但個人感覺,xfire方式很簡單且容易配置,不知為啥過時了,也沒感覺cxf、axis2哪里先進,我當時卡在cxf與was搞不定時想嘗試xfire方式被周經理給拒絕了。Xfire方式發(fā)布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);}實現(xiàn)類: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>第五步,發(fā)布,部署到服務器,訪問url:://localhost:9080/Xfire/services/Banking?wsdlAXIS2方式Axis2發(fā)布WebService有兩種方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服務器發(fā)布;其二是不打包發(fā)布〔本例〕;我不清楚打包發(fā)布有什么好處,感覺很麻煩工程外還得部署一個war,現(xiàn)在介紹第二種不打包的方式,類似xfire,同時由于cxf與was不兼容導致wsdl.jar報錯,但是xfire與axis2也用到wsdl.jar卻不報錯,我個人也是很費解,泰康工程目前使用的就是axis2方式。Axis2發(fā)布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>第三步,編寫實現(xiàn)類publicclassServiceImpl{ publicStringsayHello(Stringname){ System.out.println("================"); return"hello:"+name; }}第四步,增加WEN-INF內容將axis.war解壓下的WEN-INF文件夾內的conf、modules復制到工程WEB-INF下第五步,在WEB-INF下創(chuàng)立文件夾services〔名字不可改〕,在該目錄下創(chuàng)立文件夾〔名稱隨意〕,在該目錄下創(chuàng)立文件夾META-INF〔名稱不可改〕,在該目錄下創(chuàng)立文件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>第六步,部署到服務器,發(fā)布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>第三步,實現(xiàn)類與實體類實現(xiàn)類: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……方法第四步,創(chuàng)立配置文件:在WEB-INF下新建文件“server-config.wsdd〞<?xmlversion="1.0"encoding="UTF-8"?><deploymentxmlns=":///axis/wsdd/"xmlns:java=":///axis/wsdd/providers/java"><!--globalConfiguration標簽內容為系統(tǒng)默認無需更改<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中需要的參數(shù)-<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屬于一種比擬簡單的實現(xiàn)方式我們將WebService發(fā)布在Tomcat或者其他應用服務器上后,有很多方法可以調用該WebService,常用的有兩種:1、通過瀏覽器調用,返回標準的XML文件內容

2、通過客戶端程序調用,返回結果可自定義格式

接下來,我利用Eclipse作為開發(fā)工具,演示一個client調用WebService的簡單例如步驟如下:準備工作:用到的jar包有:下載鏈接〔:///detail/lanxuezaipiao/5354480〕第一步:新建JavaProject,工程名稱為CallWebService第二步:將所需jar包導入到庫中第三步:編寫調用class,這里有兩種方式調用,即GET方式和POST方式,由于POST方式較安全,故這里采用POST方式調用;請求數(shù)據的構造也有兩種方式:靜態(tài)和動態(tài)構造,下面分別介紹這兩種方式:注:這里以E郵寶開放的webservice接口為例調用其中一個API函數(shù),而E郵寶的webservice基于SOAP,故請求數(shù)據為SOAP格式,大家可根據自己情況進展修改。靜態(tài)構造請求數(shù)據: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請求數(shù)據添加到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對象,并發(fā)出postMethod請求ClientClient=newClient();intstatusCode=Client.executeMethod(postMethod);if(statusCode==200){System.out.println("調用成功!");StringsoapResponseData=postMethod.getResponseBodyAsString();System.out.println(soapResponseData);}else{System.out.println("調用失?。″e誤碼:"+statusCode);}}}動態(tài)構造數(shù)據: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;//動態(tài)構造調用串,靈活性更大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("調用失?。″e誤碼:"+statusCode);}}}最終運行結果:可見最終返回的也是xml格式的數(shù)據,這里數(shù)據未進展格式化顯示和處理AXIS1客戶端調用此處調用方式為axis1的調用,需要傳遞的參數(shù)可以是字符串或實體類,字符串方式:Serviceservice=newService();Callcall=(Call)service.createCall();//wsdl地址call.setTargetEndpointAddress(newURL(wsdlUrl));//設定調用3分鐘不返回則超時call.setTimeout(newInteger(180000)); //命名空間(wsdl文件中的targetNameSpace屬性值)以及方法名call.setOperationName(newQName("://com","sayHello"));//參數(shù)類型call.addParameter("name",XMLType.XSD_STRING,ParameterMode.IN);//返回值類型call.setReturnType(XMLType.XSD_STRING);//參數(shù)值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));//參數(shù)類型〔可省略〕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方式所發(fā)布的接口時,容易出現(xiàn)問題,表現(xiàn)在所傳遞的實體類的屬性內容為null,但在該實體類內新建一屬性傳如該值時,卻有值。應該是axis1對axis2的不兼容問題。并且調用axis2的接口時,需要在客戶端寫出namespace,即://call.setOperationName(newQName("://localhost:9080/WS_Axis/services/axisTest","sayHelloToUser"));該種調用方式對于axis1的接口沒問題。泰康工程最終使用的是axis1發(fā)布的接口,并使用該種方式調用的。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論