JAX-WS Web Service -春秋航空销售部分接口使用
春秋航空销售部分接口由于使用的是Web Service方式,只知道有这么一种接口类型,大多数我们还是用的RESTful Web Services,不过java已经实现了对应的标准接口:
jax-ws 、jax-rs。
对于服务的和客户端,java都支持工具一键生成,省下了很多时间。下面用java的命令wsimport 来生成春秋航空部分接口客户端代码。
wsimport命令的参数如下:(java 8 环境)
beaverdeMBP:~ beaver$ wsimport -h
无法识别的参数-h
用法: wsimport [options]
\其中 [options] 包括:
-b 指定 jaxws/jaxb 绑定文件或附加模式
(每个 都必须具有自己的 -b)
-B 将此选项传递给 JAXB 模式编译器
-catalog 指定用于解析外部实体引用的目录文件
支持 TR9401, XCatalog 和 OASIS XML 目录格式。
-d 指定放置生成的输出文件的位置
-encoding 指定源文件所使用的字符编码
-extension 允许供应商扩展 - 不按规范
指定功能。使用扩展可能会
导致应用程序不可移植或
无法与其他实现进行互操作
-help 显示帮助
-httpproxy:: 指定 HTTP 代理服务器 (端口默认为 8080)
-keep 保留生成的文件
-p 指定目标程序包
-quiet 隐藏 wsimport 输出
-s 指定放置生成的源文件的位置
-target 按给定的 JAXWS 规范版本生成代码
默认为 2.2, 接受的值为 2.0, 2.1 和 2.2
例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
-verbose 有关编译器在执行什么操作的输出消息
-version 输出版本信息
-wsdllocation @WebServiceClient.wsdlLocation 值
-clientjar 创建生成的 Artifact 的 jar 文件以及
调用 Web 服务所需的 WSDL 元数据。
-generateJWS 生成存根 JWS 实现文件
-implDestDir 指定生成 JWS 实现文件的位置
-implServiceName 生成的 JWS 实现的服务名的本地部分
-implPortName 生成的 JWS 实现的端口名的本地部分
\扩展:
-XadditionalHeaders 映射标头不绑定到请求或响应消息不绑定到
Java 方法参数
-Xauthfile 用于传送以下格式的授权信息的文件:
http://username:[email protected]/stock?wsdl
-Xdebug 输出调试信息
-Xno-addressing-databinding 允许 W3C EndpointReferenceType 到 Java 的绑定
-Xnocompile 不编译生成的 Java 文件
-XdisableAuthenticator 禁用由 JAX-WS RI 使用的验证程序,
将忽略 -Xauthfile 选项 (如果设置)
-XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
验证
\示例:
wsimport stock.wsdl -b stock.xml -b stock.xjb
wsimport -d generated http://example.org/stock?wsdl
beaverdeMBP:~ beaver$
主要参数有-generateJWS -Xnocompile -s -p :
beaverdeMBP:demo beaver$ wsimport -Xnocompile -generateJWS -keep -p com.xx.airlines.springairlines [wsdlUrl]
正在解析 WSDL...
正在生成代码...
[wsdlUrl] 为wsdl地址。
生成了很多接口实现代码:
beaverdeMBP:demo beaver$ tree
.
└── com
└── xxx
└── airlines
└── springairlines
├── AirportCityInfo.java
├── ApplyReturnTicket.java
├── ApplyReturnTicket2.java
├── ApplyReturnTicket2Response.java
├── ApplyReturnTicketInputBean.java
├── ApplyReturnTicketResponse.java
├── ApplyReturnTicketResultBean.java
├── ApplyReturnTicketResultBean2.java
├── BgFlightInfo.java
├── BgPairInfo.java
├── BgSeatInfo.java
├── BookOrder.java
├── BookOrderBookBean.java
├── BookOrderResponse.java
├── BookOrderResultBean.java
├── BookSubProdBatch.java
├── BookSubProdBatchInputBean.java
├── BookSubProdBatchResponse.java
├── BookSubProdBatchResultBean.java
├── CalcRetTktFee.java
├── CalcRetTktFeeInputBean.java
├── CalcRetTktFeeResponse.java
├── CalcRetTktFeeResultBean.java
├── CancelFlightBgApp.java
├── CancelFlightBgAppInputBean.java
├── CancelFlightBgAppResponse.java
├── CancelFlightBgAppResultBean.java
├── CancelOrder.java
├── CancelOrderInputBean.java
├── CancelOrderResponse.java
├── CancelOrderResultBean.java
├── CommonInParameter.java
├── CommonOutParameter.java
├── CountryAreaInfo.java
├── FlightBasicInfo.java
├── FlightBgAppBasicInfo.java
├── FlightBgAppHeadInfo.java
├── FlightBgAppInfo.java
├── FlightEndPointInfo.java
├── FlightInfo.java
├── FlightInfo2.java
├── FlightSeatNoBean.java
├── FlightSeatsInfoBean.java
├── FlightTimeInfo.java
├── GetBeanOfReceptionFlights.java
├── GetCountryAreaCode.java
├── GetCountryAreaCodeResponse.java
├── GetCountryAreaCodeResultBean.java
├── GetCountryAreaCodeSearchBean.java
├── GetFlightBgApp.java
├── GetFlightBgAppInputBean.java
├── GetFlightBgAppResponse.java
├── GetFlightBgAppResultBean.java
├── GetFlightSeats.java
├── GetFlightSeatsResponse.java
├── GetFlightsCanBg.java
├── GetFlightsCanBgInputBean.java
├── GetFlightsCanBgResponse.java
├── GetFlightsCanBgResultBean.java
├── GetKeguiTotalDescription.java
├── GetKeguiTotalDescription2.java
├── GetKeguiTotalDescription2Response.java
├── GetKeguiTotalDescriptionInputBean.java
├── GetKeguiTotalDescriptionResponse.java
├── GetKeguiTotalDescriptionResultBean.java
├── GetMoneyClass.java
├── GetMoneyClassResponse.java
├── GetMoneyClassResultBean.java
├── GetMoneyClassSearchBean.java
├── GetOrderDetailInfo.java
├── GetOrderDetailInfoQueryBean.java
├── GetOrderDetailInfoResponse.java
├── GetOrderDetailInfoResultBean.java
├── GetOrderSumInfo.java
├── GetOrderSumInfoQueryBean.java
├── GetOrderSumInfoResponse.java
├── GetOrderSumInfoResultBean.java
├── GetOtherFyDetail.java
├── GetOtherFyDetailInputBean.java
├── GetOtherFyDetailResponse.java
├── GetOtherFyDetailResultBean.java
├── GetRetBeanOfQueryFlightSeatNo.java
├── GetRetFlightSeatsBean.java
├── GetSpecificPrice.java
├── GetSpecificPriceInputBean.java
├── GetSpecificPriceResponse.java
├── GetSpecificPriceResultBean.java
├── GetSubProdBooked.java
├── GetSubProdBookedResponse.java
├── GetSubProdBookedResultBean.java
├── GetSubProdBySeg.java
├── GetSubProdBySegInputBean.java
├── GetSubProdBySegResponse.java
├── GetSubProdBySegResultBean.java
├── GetSubProdByTkt.java
├── GetSubProdByTktResponse.java
├── GetTravelBaoJiDetailInfo.java
├── GetTravelBaoJiDetailInfoQueryBean.java
├── GetTravelBaoJiDetailInfoResponse.java
├── GetTravelBaoJiDetailInfoResultBean.java
├── GetXprodCheckBind.java
├── GetXprodCheckBindResponse.java
├── InfoBeanOfGetSubProdBooked.java
├── InfoBeanOfGetSubProdByTkt.java
├── InsuranceBookInfo.java
├── KeguiMultInfo.java
├── MoneyClass.java
├── NormSeatPriceInfo.java
├── NormSeatPriceInfo2.java
├── ObjectFactory.java
├── OrderInfoForSlt.java
├── OrderInfoForSltList.java
├── OrderSumInfo.java
├── OtherFeePolicy.java
├── OtherFyDetailInfo.java
├── PassengerBookInfo.java
├── PassengerDetailInfo.java
├── PriceCalcResult.java
├── QueryFlightBgAppInfo.java
├── QueryFlightBgAppInfoInputBean.java
├── QueryFlightBgAppInfoResponse.java
├── QueryFlightBgAppInfoResultBean.java
├── QueryFlightSeatNo.java
├── QueryFlightSeatNoResponse.java
├── QueryOrderInfoForSlt.java
├── QueryOrderInfoForSltQueryBean.java
├── QueryOrderInfoForSltResponse.java
├── QueryOrderInfoForSltResultBean.java
├── ReceptionFlightsInfo.java
├── RetBeanOfQueryFlightSeatNo.java
├── RetFlightSeatsBean.java
├── SearchBeanOfReceptionFlights.java
├── SearchBeanOfSearchFlightsSP.java
├── SearchFlightsBatch.java
├── SearchFlightsBatchResponse.java
├── SearchFlightsBatchResultBean.java
├── SearchFlightsBatchResultBean2.java
├── SearchFlightsBatchSP.java
├── SearchFlightsBatchSPResponse.java
├── SearchFlightsBatchSearchBean.java
├── SearchFlightsBySegId.java
├── SearchFlightsBySegId2.java
├── SearchFlightsBySegId2Response.java
├── SearchFlightsBySegIdBean.java
├── SearchFlightsBySegIdResponse.java
├── SearchReceptionFlights.java
├── SearchReceptionFlightsResponse.java
├── SearchTicketDetail.java
├── SearchTicketDetailBean.java
├── SearchTicketDetailResponse.java
├── SearchTicketDetailResultBean.java
├── SingleBookBeanOfBbookSubProdBatch.java
├── SpringServiceSearchBookInterface.java
├── SpringServiceSearchBookInterfaceService.java
├── SubmitFlightBgApp.java
├── SubmitFlightBgApp2.java
├── SubmitFlightBgApp2Response.java
├── SubmitFlightBgAppInputBean.java
├── SubmitFlightBgAppResponse.java
├── SubmitFlightBgAppResultBean.java
├── SuperSeatPriceInfo.java
├── SuperSeatPriceInfo2.java
├── TicketBasicInfo.java
├── TicketDetailInfo.java
├── TicketInfo.java
├── TravelBaoJiInfo.java
├── UsernameToken.java
├── XprodBeanOfCheckBind.java
├── XprodBeanOfCheckBindInputBean.java
├── XprodBeanOfCheckBindResultBean.java
├── XprodBeanOfGetSubProd.java
├── XprodBeanOfGetSubProdBooked.java
├── XprodBookInfo.java
└── package-info.java
6 directories, 174 files
beaverdeMBP:demo beaver$
代码中接口的实现文件:
├── SpringServiceSearchBookInterface.java
├── SpringServiceSearchBookInterfaceService.java
我们测试一下看是否能调用接口成功: 查询币种 接口
SpringServiceSearchBookInterface bookInterface = service.getPort(SpringServiceSearchBookInterface.class);
GetMoneyClassSearchBean searchInfo = new GetMoneyClassSearchBean();
UsernameToken usernameToken = new UsernameToken();
usernameToken.setUsername("Username");
usernameToken.setPassword("Password");
searchInfo.setUsernameToken(usernameToken);
final GetMoneyClassResultBean moneyClass = bookInterface.getMoneyClass(searchInfo);
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("==================");
System.out.println(objectMapper.writeValueAsString(moneyClass));
输出的json:
==================
{"errCode":null,"ifSuccess":"Y","moneyClassList":[{"moneyClassCode":"THB","moneyClassId":101},{"moneyClassCode":"CNY","moneyClassId":0},{"moneyClassCode":"JPY","moneyClassId":1},{"moneyClassCode":"USD","moneyClassId":21},{"moneyClassCode":"HKD","moneyClassId":61},{"moneyClassCode":"KRW","moneyClassId":62},{"moneyClassCode":"MOP","moneyClassId":81},{"moneyClassCode":"GBP","moneyClassId":41},{"moneyClassCode":"MYR","moneyClassId":121},{"moneyClassCode":"TWD","moneyClassId":141},{"moneyClassCode":"SGD","moneyClassId":161}]}
即:
{
"errCode":null,
"ifSuccess":"Y",
"moneyClassList":[
{
"moneyClassCode":"THB",
"moneyClassId":101
},
{
"moneyClassCode":"CNY",
"moneyClassId":0
},
{
"moneyClassCode":"JPY",
"moneyClassId":1
},
{
"moneyClassCode":"USD",
"moneyClassId":21
},
{
"moneyClassCode":"HKD",
"moneyClassId":61
},
{
"moneyClassCode":"KRW",
"moneyClassId":62
},
{
"moneyClassCode":"MOP",
"moneyClassId":81
},
{
"moneyClassCode":"GBP",
"moneyClassId":41
},
{
"moneyClassCode":"MYR",
"moneyClassId":121
},
{
"moneyClassCode":"TWD",
"moneyClassId":141
},
{
"moneyClassCode":"SGD",
"moneyClassId":161
}
]
}
用了wsimport工具,生成客户端代码很方便,