生活随笔
收集整理的這篇文章主要介紹了
谈谈WebService开发-基础篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇我們通過源生JDK的方式嘗試了調用免費的查手機歸屬地的webservice服務,這篇我們來嘗試下采用Apache webservice開源框架CXF來開發一個客戶端請求下天氣預報信息。
???????? 開發步驟:
???????? 1.創建客戶端工程:Weather-cxf-Client,下載cxf相關jar包即工具,如下圖,有需要的朋友可以網上下載或小窗我;
???????? 2.利用cxf工具wsdl2java.bat生成客戶端代碼,工具在如下目錄,考慮到使用方便,將以下bin目錄設置到系統環境變量中:
?????? 3.查找免費的天氣預報服務的wsdl地址,查找方法上篇已經提供了方法,查得如下地址:http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
?????? 4.進入到第1步創建的工程的src目錄,執行wsdl2java -keep?http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl,執行此命令會報如下圖的錯誤:
上一篇評論中說過此問題的原因是由于此天氣預報的服務器端是用net開發的,java調用net開發的webservice時會有些問題,可以用如下方法解決,現在我們來驗證一下:
???????????? A.先將生成本地的wsdl文檔,瀏覽器訪問http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl將顯示的內容復制保存到一個本地文件weather.wsdl即可;
???????????? B.將本本地文檔weather.wsdl中的<s:element ref="s:schema"/><s:any />?替換成<s:any minOccurs="2" maxOccurs="2"/>;
?????????????C.用之前說的方法以本地wsdl文件來生成客戶端調用代碼,執行以及生成結果如下:
執行:
結果:
?????????5.編寫調用測試代碼:
[java]? view plain copy
package?com.devins.ws.weather;????import?java.util.List;????import?cn.com.webxml.ArrayOfString;??import?cn.com.webxml.WeatherWS;??import?cn.com.webxml.WeatherWSSoap;????public?class?WeatherQueryTest?{????????????public?static?void?main(String[]?args)?{??????????WeatherWS?factory?=?new?WeatherWS();??????????WeatherWSSoap?wsSoap?=?factory.getWeatherWSSoap();????????????????????ArrayOfString?weather?=?wsSoap.getWeather("廣州",?null);??????????List<String>?weatList?=?weather.getString();??????????for(String?temp:weatList){??????????????System.out.println(temp);??????????}????????????????}????}??
執行結果:
[plain]? view plain copy
廣東?廣州??廣州??2350??2015/05/08?08:54:27??今日天氣實況:氣溫:26℃;風向/風力:南風?3級;濕度:83%????太陽鏡指數:熱。適合穿T恤、短薄外套等夏季服裝。????5月8日?多云??24℃/31℃??無持續風向微風??1.gif??1.gif??5月9日?大到暴雨轉大雨??23℃/28℃??無持續風向微風??23.gif??9.gif??5月10日?多云??23℃/28℃??無持續風向微風??1.gif??1.gif??5月11日?大到暴雨轉雷陣雨??23℃/28℃??無持續風向微風??23.gif??4.gif??5月12日?多云??24℃/29℃??無持續風向微風??1.gif??1.gif??
注意,此客戶端工程調用無需引入cxf的相關jar包,引入執行上面的測試代碼會報如下錯誤:
[plain]? view plain copy
Exception?in?thread?"main"?javax.xml.ws.soap.SOAPFaultException:?No?namespace?on?"html"?element.?You?must?send?a?SOAP?request.???at?org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)???at?com.sun.proxy.$Proxy32.getWeather(Unknown?Source)???at?com.devins.ws.weather.WeatherQueryTest.main(WeatherQueryTest.java:18)??Caused?by:?org.apache.cxf.binding.soap.SoapFault:?No?namespace?on?"html"?element.?You?must?send?a?SOAP?request.???at?org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.readVersion(ReadHeadersInterceptor.java:109)???at?org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:142)???at?org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)???at?org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)???at?org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)???at?org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1679)???at?org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1517)???at?org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1425)???at?org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)???at?org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650)??
下一篇將深入對WSDL文檔進行分析與圖解。
總結
以上是生活随笔為你收集整理的谈谈WebService开发-基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。