Axis Java调C# Webservice
这是一个痛苦的过程,如果java对java的webservice可以说很方便,很简单,Axis,CXF等一系列框架生成客户端直接传参调用即可,但是异构语言就有点麻烦了,生成的客户端不好使。。。。。。无奈只能用Axis手动调用吧,可是,返回结果中xml的属性居然有“: @ 属性名首字母”大写这些奇奇葩葩的规则,xml很深很深,解析要命。用xml转json工具吧,由于那些奇奇葩葩的规则无法直接转,相当痛苦。。。。。。
近期,在跟某司调试接口,接口协议为webservice(很烦很烦^_^)
简单描述下环境:
我方:Java
对方:C#
首先看下对方的wsdl报文协议:
<s:element name="methodName">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="CustId" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="MenuName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Numbers" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ExtCode" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="mobilephone" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="Method_Response">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Method_Result" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="exceptionInfo" type="s:string"/>
</s:sequence>
</s:complexType>
</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()));
接下来就是解析了,解析报文过程很痛苦,不愿再回忆,都是泪。。。。
Axis Java调C# Webservice的更多相关文章
- 用C#.NET调用Java开发的WebService传递int,double问题
用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...
- Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转
Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...
- 你真的了解JAVA中与Webservice相关的规范和实现吗?
非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JA ...
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!
https://www.cnblogs.com/zhbsh/archive/2013/04/22/3035477.html 用C#.NET调用Java开发的WebService时,先在客户端封装的带有 ...
- Axis 发布、调用WebService(转)
一.JWS方法发布WebService 1.在官方网站下载axis的工程(这个等下就有用的)和源码.jar包等,下载地址是: http://www.apache.org/dyn/closer.cgi/ ...
- Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法
同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参数的方法每次我这边的webservice日志都记录参数为空,而我自己.Net程序调用完全没有问题,后面 ...
- Java调用.NET webservice方法的几种方式
最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...
- java调用C# webService发布的接口
java调用C# webService发布的接口 java调用C# webService方式有很多种我这里只介绍一种 首先需要引入axis的jar包 axis的maven坐标如下 <depend ...
- Java调优
Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...
随机推荐
- Beautiful Sequence
Beautiful Sequence 给定一些数(可能相同),将它们随机打乱后构成凹函数,求概率 .N<=60 . 首先,这种题求概率事实上就是求方案.所以现在要求的是用这些数构成凹函数的方案数 ...
- s5pv210移植Minigui3.0.12
移植平台:ubuntu:14.04 开发板:s5pv210(A8) Minigui版本:3.0.12-------------------------------------------------- ...
- How to grow up as a BA
简书 https://www.jianshu.com/p/8f62b5c7fe1b Thoughtworks https://mp.weixin.qq.com/s/n1hGAM2nUoLvkE5xuU ...
- C++学习笔记-关键词
1.friend友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分( ...
- [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579
题意翻译 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 ...
- 牛客寒假算法基础集训营4 G Applese 的毒气炸弹
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...
- 删除Ati显卡桌面右键菜单(配置可交换显卡,显示卡属性,图形选项,图形属性)
Win+R 打开注册表 依次找到 HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers 保留Gadgets.New.Sh ...
- django 访问静态资源
urlpatterns = patterns('', url(r'^$', views.show, name='index'), url(r'^static/(?P<path>.*)', ...
- 【笔记】Django的ORM之多对多表的增和删
[笔记]Django的ORM之多对多表的增和删 Django ORM 多对多 一 昨日补充:外键关联 外键在ORM中的关联方式: 与数据表相关的类都放到models.py文件中 class Book ...
- P2895 [USACO08FEB]流星雨Meteor Shower
传送门 预处理出每个位置最早被摧毁的时间,在此之前都可以走 直接dfs加个记忆化和最优性剪枝就好了 一定要注意流星的边界,如果波及到负数坐标的位置不要去考虑会RE 一定要考虑流星砸到边界的情况 如 ( ...