當前位置:首頁 » 密碼管理 » cxf訪問webservice

cxf訪問webservice

發布時間: 2022-08-17 08:21:37

① 如何使用CXF調用webservice介面

webservice的調用,常用的大約有3種方式:
1、使用axis調用
2、使用xfire調用
3、使用cxf調用
項目中,採用axis進行調用,記錄如下,備忘:
ps教程:想當年的時候是用的xfire方式調用的,結果沒做記錄,現在已經完全記不得怎麼玩了。所以說要多寫博客啊 t_t
版本說明:
aixs版本:axis-bin-1_4.zip
java環境略
第一步:確保wsdl文件可用,文中為獲取到sendsmsservice.wsdl,當然url的也行。
第二步:執行生成客戶端代碼的腳本。腳本內容為:
set axis_lib=d:axis-1_4lib
set java_cmd=java -djava.ext.dirs=%axis_lib%
set output_path=.
set package=info.jyzh.wap.liaoning.push
%java_cmd% org.apache.axis.wsdl.wsdl2java sendsmsservice.wsdl -o%output_path% -p%package% -t

#查看wsdl2java的使用幫助#%java_cmd% org.apache.axis.wsdl.wsdl2java -help

ok,至此,客戶端代碼就生成出來了。還帶了一個單元測試哦。

實際工作中,碰到以下情況,客戶端不能直接連上webservice伺服器,中間被強大的代理伺服器擋住了。如下圖:

為此,修改生成的代碼,本次是在中作修改,如下:
static {
axisproperties.setproperty("http.proxyhost","88.88.88.88");
axisproperties.setproperty("http.proxyport","8080");
axisproperties.setproperty("http.proxyuser","asp教程yy");
axisproperties.setproperty("http.proxypassword","123456");
_operations = new org.apache.axis.description.operationdesc[1];
_initoperationdesc1();

② java cxf動態調用服務端的webservices方法

WebService實現
1、 整個項目使用CXF來實現,在實現的過程中,在MyEclipse中對CXF下lib中的所有jar文件通過引入外部包來處理。
2、 在MyEclipse6.5中可以實現伺服器端和客戶端,但是客戶端在使用wsdl進行動態調用的過程中總是報錯,最後使用MyEclipse9.0實現了進行動態調用的實現。其中發生的錯誤如下:
(1)Exception in thread "main" java.lang.LinkageError: 正在從引導類載入器載入 JAXB 2.1 API, 但此 RI (來自jar:file:/D:/CXF/lib/jaxb-impl-2.2.5.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。請使用授權目錄機制將 jaxb-api.jar 放在引導類載入器中。(請參閱 http://java.sun.com/j2se/1.6.0/docs/guide/standards/)
解決辦法:
通過刪除引入包中的jaxb-impl-2.2.5.jar文件可以解決。
(2)java.lang.IllegalArgumentException: Can not set final com.sun.tools.internal.xjc.reader.internalizer.InternalizationLogic field

③ cxf怎樣提高webservice性能,及訪問速度調優

1、 啟用FastInfoset(快速信息集)

webservice的性能實在是不敢恭維。曾經因為webservice吞吐量上不
去,對webservice進行了一些性能方面的優化,採用了FastInfoset,效果很明顯,極端條件下的大數據量傳輸,性能提高60%,他可以減
少傳輸成本,序列化成本和xml解析成本。

Cxf提供了FastInfoset協商機制,實現類見org.apache.cxf.feature.FastInfosetFeature,在bus中啟用如下配置:

<cxf:features><cxf:fastinfoset force="false"/></cxf:features>

Force=false表示服務端和客戶端第一次通信時會協商(通過檢查標準的HTTP頭的Accept欄位,值為MIME類型的application/fastinfoset)是否啟用FastInfoset支持,如果客戶端不支持,則不啟用快速信息集。

需要在pom中添加依賴:

<dependency>

<groupId>com.sun.xml.fastinfoset</groupId>

<artifactId>FastInfoset</artifactId>

<version>1.2.9</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

FastInfoset參考:http://java.sun.com/developer/technicalArticles/xml/fastinfoset/

client和service端都要配置

2、 啟用gzip壓縮支持

客戶端和伺服器端是否使用Gzip壓縮,也是基於http協議協商的(檢查請求
header 中是否有Accept-encoding:gzip)。但是這里需要仔細權衡下。對於小數據量,啟用gzip壓縮支持是吃力不討好的行為,
數據量很小的時候,gzip壓縮結果不明顯,還浪費cpu。我們需要權衡數據大小,按照經驗設置threshold為10*1024byte。

在bus中啟用如下配置:

<bean class="org.apache.cxf.transport.common.gzip.GZIPFeature ">

<property name="threshold"><value>10240</value></property>

</bean>

官方文檔指定是是配置org.apache.cxf.transport.http.gzip.GZIPFeature,但是這個類會找不到,可能是官方文檔年久失修,造成一些混亂。官方文檔中也沒提示指定threshold,請參考GZIPFeature源代碼。

參考http://cxf.apache.org/docs/featureslist.html

3、 使用slf4j代替cxf默認日誌組件

CXF 默認使用java.util.logging作為日誌列印組件,其性能我就不過多評價,也不太便於我們做統一日誌管理。目前系統使用的slf4j作為日誌列印組件,替換如下:

在classpath中加入META-INF/cxf/org.apache.cxf.Logger文件,文件內容為

org.apache.cxf.common.logging.Slf4jLogger

4、 測試中啟用日誌

bus中加入<cxf:logging/>,請在測試環境中啟用有助於debug

補充:

1、如何自定義返回碼:

請求在service中處理遇到異
常後,會調用請求鏈中所有攔截器的handleFault方法,參考PhaseInterceptorChain#unwind,然後判斷請求是否單向請
求,如果不是,則構建異常請求鏈,並構建異常message對象,調用異常請求鏈中的handleMessage 方法(參
考:)

JAXWSMethodInvoker
轉發soap請求到指定對象的方法,如果在請求處理失敗,調用updateHeader方法,把請求時的soap
header放入返回header中。但是不同通過繼承JAXWSMethodInvoker來實現清除異常時soap
header也返回給客戶端的問題,因為JAXWSMethodInvoker沒有採用注入的機制
(JaxWsServerFactoryBean#createInvoker)也沒有chain.異常時,會由這些攔截器處理返回請求:

setup []

prepare-send [MessageSenderInterceptor, Soap11FaultOutInterceptor]

pre-stream [LoggingOutInterceptor, StaxOutInterceptor]

pre-protocol [WebFaultOutInterceptor]

write [SoapOutInterceptor]

攔截器初始化類

我們可以在異常鏈中加入清理soap header的攔截器,清理掉在系統異常時soapheader中有信息的問題。

返回錯誤狀態碼,在執行Soap11FaultOutInterceptor攔截器中被寫死。

message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));

為了使返回數據中有錯誤碼,需要在Soap11FaultOutInterceptor後面加入攔截器

2、在項目測試時遇到一個報錯
invalid LOC header (bad
signature),這個問題是因為jar包損壞照成的,雖然構建路徑中有這個jar,但是還是會出現loadClass失敗,清理maven 本地倉
庫目錄的jar,修改pom(比如加上一空行)讓m2e重新載入。
3、Cxf中有一個很不錯的特性,支持javascript訪問soap
webservice,客戶端訪問http://localhost:8080/cxf/HelloWorld?js類似的請求,會生成
javascript 客戶端,js編程時就可以使用此客戶端提供的對象,啟用此功能需要在引入

<import resource="classpath:META-INF/cxf/cxf-extension-javascript-client.xml" />並且在依賴中加入:

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-javascript</artifactId>

<version>2.4.1</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

④ cxf如何創建webservice客戶端

public static void main(String[] args) throws Exception {
//這個是用cxf 客戶端訪問cxf部署的webservice服務
//千萬記住,訪問cxf的webservice必須加上namespace ,否則通不過
//現在又另外一個問題,傳遞過去的參數服務端接收不到
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient("");
//url為調用webService的wsdl地址
QName name=new QName("","getAlbumList");
//namespace是命名空間,methodName是方法名
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ " <facelook>"
+ " <condition>"
+ " <name>家</name>"
+ " <description></description>"
+ " <pageno></pageno>"
+ " <pagesize></pagesize>"
+ " </condition>"
+ " </facelook>";
//paramvalue為參數值
Object[] objects=client.invoke(name,xmlStr);
//調用web Service//輸出調用結果
System.out.println(objects[0].toString());
}

⑤ 如何使用CXF調用webservice介面

webservice的調用,常用的大約有3種方式:
1、使用axis調用
2、使用xfire調用
3、使用cxf調用
項目中,採用axis進行調用,記錄如下,備忘:
ps教程:想當年的時候是用的xfire方式調用的,結果沒做記錄,現在已經完全記不得怎麼玩了。所以說要多寫博客啊 t_t
版本說明:
aixs版本:axis-bin-1_4.zip
java環境略
第一步:確保wsdl文件可用,文中為獲取到sendsmsservice.wsdl,當然url的也行。
第二步:執行生成客戶端代碼的腳本。腳本內容為:
set axis_lib=d:axis-1_4lib
set java_cmd=java -djava.ext.dirs=%axis_lib%
set output_path=.
set package=info.jyzh.wap.liaoning.push
%java_cmd% org.apache.axis.wsdl.wsdl2java sendsmsservice.wsdl -o%output_path% -p%package% -t

#查看wsdl2java的使用幫助#%java_cmd% org.apache.axis.wsdl.wsdl2java -help

ok,至此,客戶端代碼就生成出來了。還帶了一個單元測試哦。

實際工作中,碰到以下情況,客戶端不能直接連上webservice伺服器,中間被強大的代理伺服器擋住了。如下圖:

為此,修改生成的代碼,本次是在中作修改,如下:
static {
axisproperties.setproperty("http.proxyhost","88.88.88.88");
axisproperties.setproperty("http.proxyport","8080");
axisproperties.setproperty("http.proxyuser","asp教程yy");
axisproperties.setproperty("http.proxypassword","123456");
_operations = new org.apache.axis.description.operationdesc[1];
_initoperationdesc1();
}直接axis調用遠程的web service我覺得這種方法比較適合那些高手,他們能直接看懂xml格式的wsdl文件,我自己是看不懂的,尤其我不是專門搞這行的,即使一段時間看懂,後來也就忘記了。直接調用模式如下:import java.util.date;import java.text.dateformat;import org.apache.axis.client.call;import org.apache.axis.client.service;import javax.xml.namespace.qname;import java.lang.integer;import javax.xml.rpc.parametermode; public class caclient { public static void main(string[] args) { try { string endpoint = "http://localhost:8080/ca3/services/casynrochnized?wsdl"; //直接引用遠程的wsdl文件 //以下都是套路
service service = new service(); call call = (call) service.createcall(); call.settargetendpointaddress(endpoint); call.setoperationname("adser");//wsdl裡面描述的介面名稱 call.addparameter("username", org.apache.axis.encoding.xmltype.xsd_date, javax.xml.rpc.parametermode.in);//介面的參數 call.setreturntype(org.apache.axis.encoding.xmltype.xsd_string);//設置返回類型
string temp = "測試人員"; string result = (string)call.invoke(new object[]{temp}); //給方法傳遞參數,並且調用方法 system.out.println("result is "+result); } catch (exception e) { system.err.println(e.tostring()); } }}2,直接soap調用遠程的webservice這種模式我從來沒有見過,也沒有試過,但是網路上有人貼出來,我也轉過來import org.apache.soap.util.xml.*;import org.apache.soap.*;import org.apache.soap.rpc.*; import java.io.*;import java.net.*;import java.util.vector; public class caservice{ public static string getservice(string user) { url url = null; try { url=new url("http://192.168.0.100:8080/ca3/services/casynrochnized"); } catch (malformerlexception mue) { return mue.getmessage(); } // this is the main soap object call soapcall = new call(); // use soap encoding soapcall.setencodingstyleuri(constants.ns_uri_soap_enc); // this is the remote object we're asking for the price soapcall.settargetobjecturi("urn:xmethods-casynrochnized"); // this is the name of the method on the above object soapcall.setmethodname("getuser"); // we need to send the isbn number as an input parameter to the method vector soapparams = new vector(); // name, type, value, encoding style parameter isbnparam = new parameter("username", string.class, user, null); soapparams.addelement(isbnparam); soapcall.setparams(soapparams); try { // invoke the remote method on the object response soapresponse = soapcall.invoke(url,""); // check to see if there is an error, return "n/a" if (soapresponse.generatedfault()) { fault fault = soapresponse.getfault(); string f = fault.getfaultstring(); return f; } else { // read result parameter soapresult = soapresponse.getreturnvalue (); // get a string from the result return soapresult.getvalue().tostring(); } } catch (soapexception se) { return se.getmessage(); } }}
3,使用wsdl2java把wsdl文件轉成本地類,然後像本地類一樣使用,即可。

⑥ 如何使用CXF調用webservice介面

webservice的調用,常用的大約有3種方式:
1、使用axis調用
2、使用xfire調用
3、使用cxf調用
項目中,採用axis進行調用,記錄如下,備忘:
ps教程:想當年的時候是用的xfire方式調用的,結果沒做記錄,現在已經完全記不得怎麼玩了。所以說要多寫博客啊 t_t
版本說明:
aixs版本:axis-bin-1_4.zip
java環境略
第一步:確保wsdl文件可用,文中為獲取到sendsmsservice.wsdl,當然url的也行。
第二步:執行生成客戶端代碼的腳本。腳本內容為:
set axis_lib=d:axis-1_4lib
set java_cmd=java -djava.ext.dirs=%axis_lib%
set output_path=.
set package=info.jyzh.wap.liaoning.push
%java_cmd% org.apache.axis.wsdl.wsdl2java sendsmsservice.wsdl -o%output_path% -p%package% -t

#查看wsdl2java的使用幫助#%java_cmd% org.apache.axis.wsdl.wsdl2java -help

ok,至此,客戶端代碼就生成出來了。還帶了一個單元測試哦。

⑦ 使用cxf調用webservice

埠是否正確?
瀏覽器是否能訪問到wsdl?

⑧ cxf生成的webservice如何通過web訪問

如果你指的訪問是與服務端進行交互 那你就需要通過wsdl文件實現客戶端才可以。
如果你指的是訪問wsdl 只需要訪問指定的的介面並且後面加上?wsdl就能看到發布出來的wsdl文件

⑨ cxf webservice 客戶端調用內存溢出,內存不會自動釋放,請問各位大俠是怎麼解決的。

解決方法:1、使用單利模式創建cxf客戶端;2、不適用cxf方式調用webservice,改用http方式調用。

熱點內容
逆戰腳本掛機 發布:2025-05-16 22:30:01 瀏覽:935
java隨機產生數 發布:2025-05-16 22:25:52 瀏覽:255
java任務管理 發布:2025-05-16 22:17:02 瀏覽:571
安卓如何修改cpu 發布:2025-05-16 21:58:20 瀏覽:364
pythonainb 發布:2025-05-16 21:45:56 瀏覽:855
淘汰伺服器可以做家用電腦嗎 發布:2025-05-16 21:41:31 瀏覽:843
遊程編碼c語言 發布:2025-05-16 21:26:51 瀏覽:587
帝來哪個配置值得購買 發布:2025-05-16 21:12:29 瀏覽:463
什麼是nodejs前端伺服器 發布:2025-05-16 21:12:17 瀏覽:406
編譯選項立即綁定未定義符號 發布:2025-05-16 20:55:13 瀏覽:907