工作也快半年了纤泵,時間很快用狱,發(fā)現(xiàn)自己越來越懶了译仗,書都堆灰了...平時工作雖忙但是周末不忙啊哈哈,看了zhoumorvan大神的博客和身邊給力的小伙伴們略号,決定以后還是多看看多寫寫多分享刑峡。
記錄是一個極好的習(xí)慣,我們會的知識中玄柠,有很大一部分其實是相對碎片的突梦,很容易忘記。將它們整理并記下來是一個結(jié)構(gòu)化知識的過程羽利,也是一個整理和總結(jié)的過程宫患。
工作第一篇,來個極簡的:最近接入了人口信息應(yīng)用平臺的Web Service服務(wù)这弧,第一次接觸娃闲,就說一說使用CFX來調(diào)用Web Service服務(wù)的方式(沒寫如何發(fā)布Web Service服務(wù),因為沒做匾浪,可參考CXF和Spring整合發(fā)布和基于Maven在Spring中集成CXF Web Service框架)皇帮。
CXF調(diào)用Web Service服務(wù)
1、下載CXF蛋辈,解壓即用(環(huán)境變量)
2属拾、主要使用wadl2java這個工具,將Web Service發(fā)布的服務(wù)生成客戶端java代碼
wsdl2java -encoding utf-8 -p com.test.nciic -d D:\\src -all NciicServices.wsdl
- encoding:編碼
- p:package(這個包的結(jié)構(gòu)需要注意冷溶,需要與代碼中的包結(jié)構(gòu)一致)
- d:代碼生成目錄
3渐白、通過CXF的JaxWsProxyFactoryBean類來調(diào)用Web Service服務(wù)
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(NciicServicesPortType.class);
factory.setAddress("https://ws.nciic.org.cn/nciic_ws/services/NciicServices");
private NciicServicesPortType client = (NciicServicesPortType) factory.create();
String responseXmlStr = client.nciicCheck(nciicAuthKey, requestXmlStr); // 調(diào)用nciic服務(wù)
也可以集成在spring mvc中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<!--
使用<jaxws:clietn>調(diào)用服務(wù)端
jaxws:client內(nèi)部使用JaxWsProxyFactoryBean方式
serviceClass:指定portType地址(需要使用wsdl2java工具生成)
-->
<jaxws:client id="client" address="https://ws.nciic.org.cn/nciic_ws/services/NciicServices"
serviceClass="com.test.nciic.NciicServicesPortType">
</jaxws:client>
</beans>
public void testCxfSpringClient(){
//從Spring容器中取出portType
NciicServicesPortType client = (NciicServicesPortType) applicationContext.getBean("client");
String responseXmlStr = client.nciicCheck(nciicAuthKey, requestXmlStr); // 調(diào)用nciic服務(wù)
}
這里的NciicServicesPortType是CXF生成的Web Service接口類,里面定義了wsdl文件所描述的所有服務(wù)接口挂洛,形式如下:
/**
* This class was generated by Apache CXF 3.1.13
* 2017-10-27T17:18:40.243+08:00
* Generated source version: 3.1.13
*
*/
@WebService(targetNamespace = "https://api.nciic.org.cn/NciicServices", name = "NciicServicesPortType")
@XmlSeeAlso({ObjectFactory.class})
public interface NciicServicesPortType {
@WebResult(name = "out", targetNamespace = "https://api.nciic.org.cn/NciicServices")
@RequestWrapper(localName = "nciicCheck", targetNamespace = "https://api.nciic.org.cn/NciicServices", className = "com.test.nciic.NciicCheck")
@WebMethod
@ResponseWrapper(localName = "nciicCheckResponse", targetNamespace = "https://api.nciic.org.cn/NciicServices", className = "com.test.nciic.NciicCheckResponse")
public String nciicCheck(
@WebParam(name = "inLicense", targetNamespace = "https://api.nciic.org.cn/NciicServices")
String inLicense,
@WebParam(name = "inConditions", targetNamespace = "https://api.nciic.org.cn/NciicServices")
String inConditions
);
}
PS:Nciic這個是個自簽名(或CNNIC證書)的https礼预,還需要安裝它網(wǎng)站的證書,參考StevenLian這個博客虏劲。附一個java添加證書信任列表的靜態(tài)代碼塊:
static {
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier() {
@Override
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
//域名或ip地址
if (hostname.equals("ws.nciic.org.cn")) {
return true;
}
return false;
}
});
System.setProperty("javax.net.ssl.trustStore", "C:\\jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit";
}
PS:Nciic這個服務(wù)挺慢的(200ms)托酸,還挺貴的(按次收費)...我們在調(diào)用時加入memcache緩存,避免短時相同請求重復(fù)調(diào)用柒巫,并且將驗證通過的結(jié)果寫入到數(shù)據(jù)庫中励堡,先查緩存和數(shù)據(jù)庫最后再用第三方服務(wù)。
思考
Web Service通過基于XML的SOAP來表示數(shù)據(jù)和請求堡掏,低耦合应结,在接口的發(fā)布和復(fù)用性上確實還行,接口的可讀性也可以,但是確實還是沒有調(diào)Http服務(wù)的api接口方便鹅龄,很多國企和國家的對外服務(wù)貌似Web Service用的很多揩慕,但是在互聯(lián)網(wǎng)公司貌似用的很少。Nciic服務(wù)使用Xml做請求和返回方式還是沒有json方便扮休,orz迎卤。
2017/11/18 done
此文章也同步至個人Github博客