Java使用axis方式實(shí)現(xiàn)發(fā)送xml參數(shù)的WebService接口調(diào)用

  1. 先說一下什么是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ī)范的。

  1. 下面是介紹如何使用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

mvnrepository.png

(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處理所有的返回消息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容