- 先說一下什么是webservice
webservice的 發(fā)布一般都是使用WSDL(web service descriptive language)文件的樣式來發(fā)布的,在WSDL文件里面,包含這個(gè)webservice暴露在外面可供使用的接口。
(1)WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語言間的相互調(diào)用,通過Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互。
(2)WebService實(shí)現(xiàn)不同語言間的調(diào)用,是依托于一個(gè)標(biāo)準(zhǔn),webservice是需要遵守WSDL(web服務(wù)定義語言)/SOAP(簡(jiǎn)單請(qǐng)求協(xié)議)規(guī)范的。
- 下面是介紹如何使用axis調(diào)用webservice接口
(1)先從官網(wǎng)下載axis相關(guān)jar包,地址:http://axis.apache.org/axis/
官方要求引入如下jar包(將lib下的jar引入即可)
axis-<version>/lib/axis.jar
axis-<version>/lib/jaxrpc.jar
axis-<version>/lib/saaj.jar
axis-<version>/lib/commons-logging-<version>.jar
axis-<version>/lib/commons-discovery-<version>.jar
axis-<version>/lib/wsdl4j-<version>.jar
(2)通過mvnrepository獲取
鏈接地址:https://mvnrepository.com/artifact/org.apache.axis/axis/1.4

(2)具體代碼實(shí)現(xiàn)
/**
* 獲取預(yù)算
* @param paras
* @return
*/
public String getBudget(Map<String, Object> paras) {
String response = "";
try {
//wsdl地址
String endpoint = String.format("%s/****/****/BudgetProcess.asmx?wsdl",
Util.null2String(new PropBean().getPropName("budgetIp")));
//標(biāo)識(shí)SOAP HTTP請(qǐng)求的目的地
String soapAction = "http://tempuri.org/";
String bgElement = Util.null2String(paras.get("BgElement"));
if (StringUtils.isBlank(bgElement)) {
bgElement = "0101";
}
String bgPeriod = Util.null2String(paras.get("BgPeriod"));
if (StringUtils.isBlank(bgPeriod)) {
bgPeriod = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
Service service = new Service();
Call call = (Call) service.createCall();
//構(gòu)造xml參數(shù)報(bào)文
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName(soapAction, "GetBudget"));
call.addParameter(new QName(soapAction, "deptNum"), Constants.XSD_STRING, ParameterMode.IN);
call.addParameter(new QName(soapAction, "deptType"), Constants.XSD_STRING, ParameterMode.IN);
call.addParameter(new QName(soapAction, "Bgitem"), Constants.XSD_STRING, ParameterMode.IN);
call.addParameter(new QName(soapAction, "BgElement"), Constants.XSD_STRING, ParameterMode.IN);
call.addParameter(new QName(soapAction, "BgPeriod"), Constants.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);//(標(biāo)準(zhǔn)的類型)
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapAction + "GetBudget");
writeLog("get budget request:" + String
.format("deptNum=%s, deptType=%s, Bgitem=%s, BgElement=%s, BgPeriod=%s",
Util.null2String(paras.get("deptNum")), Util.null2String(paras.get("deptType")),
Util.null2String(paras.get("Bgitem")), bgElement, bgPeriod));
response = (String) call.invoke(new Object[]{Util.null2String(paras.get("deptNum")),
Util.null2String(paras.get("deptType")), Util.null2String(paras.get("Bgitem")), bgElement,
bgPeriod});
response = XML.toJSONObject(response).toString();
if ("1".equals(Util.null2String(new PropBean().getPropName("show.debug.log")))) {
writeLog("get budget response:" + response);
}
} catch (Exception e) {
writeLog("get budget error", e);
}
return response;
}
(3) soapAction是什么?
Action 在WS規(guī)范里,用來定義消息請(qǐng)求的地址。也就是消息發(fā)送到哪個(gè)操作或者服務(wù)方法。這里涉及到WCF如何處理消息請(qǐng)求和分發(fā)消息的問題。
WCF OperationContract屬性提供了對(duì)請(qǐng)求和返回消息地址的配置。
1.Action屬性,設(shè)置WS-Addressing格式的地址,這個(gè)地址是來指定請(qǐng)求消息的目的地.
2.ReplyAction屬性設(shè)置WS-Addressing格式的地址,這個(gè)地址是來指定返回消息的目的地.
備注:這里其實(shí)和Web 服務(wù)類似。WS-Addressing協(xié)議是行業(yè)標(biāo)準(zhǔn),來識(shí)別消息的來源和目的地,使用WS- Security對(duì)到目的地的來源進(jìn)行身份驗(yàn)證。
WCF 默認(rèn)使用的Action的值是服務(wù)契約的namespace+ 服務(wù)契約+操作名字 (Action = "<a href=" /frank_xl/IWCFOverLoadingService/SayHelloOverLoading2"" ),不代表實(shí)際的服務(wù)地址。WCF框架會(huì)在收到請(qǐng)求后作地址映射,發(fā)消息發(fā)送到實(shí)際的操作上
所以一個(gè)攜帶Action值的消息到來,WCF分發(fā)器dispatcher會(huì)根據(jù)Action的Value來確定發(fā)給那個(gè)操作方法。這個(gè)過程消息會(huì)被反序列化。
設(shè)置Action=”” 可以使用一個(gè)Operation處理所有的請(qǐng)求消息。ReplyAction=”” 可以使用一個(gè)Operation處理所有的返回消息。