zoukankan      html  css  js  c++  java
  • Axis Java调C# Webservice

    这是一个痛苦的过程,如果java对java的webservice可以说很方便,很简单,Axis,CXF等一系列框架生成客户端直接传参调用即可,但是异构语言就有点麻烦了,生成的客户端不好使。。。。。。无奈只能用Axis手动调用吧,可是,返回结果中xml的属性居然有“: @ 属性名首字母”大写这些奇奇葩葩的规则,xml很深很深,解析要命。用xml转json工具吧,由于那些奇奇葩葩的规则无法直接转,相当痛苦。。。。。。

    近期,在跟某司调试接口,接口协议为webservice(很烦很烦^_^)

    简单描述下环境:

    我方:Java

    对方:C#

    首先看下对方的wsdl报文协议:

     1 <s:element name="methodName">
     2 <s:complexType>
     3 <s:sequence>
     4 <s:element minOccurs="1" maxOccurs="1" name="CustId" type="s:int"/>
     5 <s:element minOccurs="0" maxOccurs="1" name="MenuName" type="s:string"/>
     6 <s:element minOccurs="0" maxOccurs="1" name="Numbers" type="s:string"/>
     7 <s:element minOccurs="0" maxOccurs="1" name="ExtCode" type="s:string"/>
     9 <s:element minOccurs="0" maxOccurs="1" name="mobilephone" type="s:string"/>
    10 </s:sequence>
    11 </s:complexType>
    12 </s:element>
    13 <s:element name="Method_Response">
    14 <s:complexType>
    15 <s:sequence>
    16 <s:element minOccurs="0" maxOccurs="1" name="Method_Result" type="s:string"/>
    17 <s:element minOccurs="0" maxOccurs="1" name="exceptionInfo" type="s:string"/>
    18 </s:sequence>
    19 </s:complexType>
    20 </s:element>

    报文头:

    <s:element name="Header" type="tns:Header"/>
    <s:complexType name="Header">
    <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="UserName" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="PassWord" type="s:string"/>
    <s:element minOccurs="1" maxOccurs="1" name="RoleId" type="s:int"/>
    </s:sequence>
    <s:anyAttribute/>
    </s:complexType>

    报文协议类似这样,很有个性吧,下划线,首字母大写

    请求部分代码:

    Service service = new Service();
    Call call = (Call)service.createCall();
    
    //添加接口规范字段
    call.addParameter(new QName(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "CustId"), XMLType.XSD_INTEGER, ParameterMode.IN);
    call.addParameter(new QName(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "MenuName"), XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter(new QName(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "Numbers"), XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter(new QName(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "ExtCode"), XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter(new QName(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "mobilephone"), XMLType.XSD_STRING, ParameterMode.IN);
    
    
    Object[] params = new Object[]{100010010, "/user/oop", 3, 100, 13569698990};
    
    call.setTargetEndpointAddress(new URL("http://113.221.252.3:8871/SomeWebService.asmx?wsdl"));
    call.setUseSOAPAction(true);
    //这里是targetNamespace + 方法名称
    call.setSOAPActionURI("htt://aabb.com" + methodName);
    call.setOperationName(new QName("htt://aabb.com", methodName));
    
    SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(Sky400Enums.INTERFACE_PARAMS.getNameSpace(), "Header");
    soapHeaderElement.setPrefix("");
    soapHeaderElement.setNamespaceURI("htt://aabb.com");
    
    //这里是添加SOAP头,否则接口外层校验不过
    try {
        soapHeaderElement.addChildElement("UserName").setValue("admin");
        soapHeaderElement.addChildElement("PassWord").setValue("password");
        soapHeaderElement.addChildElement("RoleId").setValue(1);
    } catch (SOAPException e) {
        e.printStackTrace();
    }
    
    call.addHeader(soapHeaderElement);
    call.setReturnType(XMLType.SOAP_STRING);
    call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);
    
    //开始调对方接口
    Object obj = call.invoke(params);
    MessageContext messageContext = call.getMessageContext();
    //请求报文
    Message reqMsg = messageContext.getRequestMessage();
    //返回报文
    Message repMsg = messageContext.getResponseMessage();
    logger.info(methodName + "请求报文:" + StringEscapeUtils.unescapeHtml(reqMsg.getSOAPPartAsString()));
    logger.info(methodName + "返回报文:" + obj);
    logger.info(methodName + "返回报文:" + StringEscapeUtils.unescapeHtml(repMsg.getSOAPPartAsString()));

    接下来就是解析了,解析报文过程很痛苦,不愿再回忆,都是泪。。。。

  • 相关阅读:
    using关键字的使用
    浅谈重写、重载、继承、多态
    ASP.NET控件之Content控件
    CommandArgument用法
    sql语句导入导出大全
    常用正则表达式
    做饭71技巧
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员
    如何成为一个技术“牛人”
    Yahoo! Media Player 将播放器放在自己网站上
  • 原文地址:https://www.cnblogs.com/dbaxyx/p/7390238.html
Copyright © 2011-2022 走看看