在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这是一个痛苦的过程,如果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())); 接下来就是解析了,解析报文过程很痛苦,不愿再回忆,都是泪。。。。
|
请发表评论