java:浅谈axis调用webservice接口
【申明:此代码已经经过测试可以正确使用;但内容解释为个人见解,如有不准确之处,请指教。
阅读前请先仔细阅读“【】”中的说明文字,以免与您的需求不符而浪费时间。】
【前提:对方给了一个wsdl文件,用axis根据此wsdl文件,写一个访问其webservice接口的方法。其中还知道
了对方报文实体(RequestBody)和回复实体(ResponseBody:也就是wsdl的返回对象实体)
流程:我方通过webservice接口(http://14.2.33.94:9103/BSBOPM/services/OPMgetMDSData)向对方发
送报文 ---> 对方收到后,再给我方一个回复。】
【开发环境:MyEclipse6.5; web项目】
【语言: java、axis1】
【接口属性:参数类型:对象(RequestBody);返回类型:对象(ResponseBody)】
步骤:
1.首先引用相关jar包:
axis-ant.jar、axis.jar、commons-discovery-0.2.jar、wsdl4j-1.5.1.jar、httpclient-4.2.1.jar、httpcore-4.2.2.jar。(httpclient-4.2.1.jar、httpcore-4.2.2.jar 这个不确定是否用过,之所以引用了这两个包,是在另一个功能中使用HttpPost进行webservice回复功能。建议:可先不需要引这两个包)。
2.查看wsdl文件:
注:此是已经发布成功的wsdl文件,而非其源码(.wsdd)文件。
<?xml verson="1.0">
<wsdl:definitions targetNamespace="http://service.axis.com/da/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://service.axis.com/da/"
xmlns:intf="http://ervice.axis.com/da/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
.....>
<wsdl:types>
<schema targetNamespace="http://service.axis.com/da/"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="MessageBody">
<sequence>
<element name="jobStatus" nillable="true" type="xsd:string" />
<element name="jobTicket" nillable="true" type="xsd:string" />
<element name="sendTime" nillable="true" type="xsd:string" />
<element name="systemDate" nillable="true" type="xsd:string" />
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="MessageHandlerRequest">
<wsdl:part name="requestBody" type="impl:MessageBody">
</wsdl:message>
<wsdl:message name="MessageHandlerRespnse">
<wsdl:part name="MessageHandlerReturn" type="impl:MessageBody">
</wsdl:message>
<wsdl:portType name="RemoteRevServiceImpl">
<wsdl:operation name="MessageHandler" parameterOrder="requestBody">
<wsdl:input message="impl:MessageHandlerRequest" name="MessageHandlerRequest" />
<wsdl:output message="impl:MessageHandlerRequestResponse
name="MessageHandlerResponse" />
</wsdl:operation>
</wsdl:portType>
【析:portType:wsdl最重要的元素,定义一了个端口;
operation name="" :操作方法,即:可理解为:从哪个方法开始执行。
input:一个名为“MessageHandlerReques”的输入消息;
output:一个名为:"MessagehandlerResponse"的输出消息
】
<wsdl:binding name="OPMgetMDSDataSoapBinding" type="impl:RemoteRevServiceImpl">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="MessageHandler">
<wsdlsoap:operation soapActon="" />
<wsdl:input name="MessageHandlerRequest">
<wsdlsoap:body namespace="http://service.axis.com/da/" use="literal" />
</wsdl:input>
<wsdl:output name="MessageHandlerResponse">
<wsdlsoap:body namespace="http://service.axis.com/da/" use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:binding>
【析:binding中:
name : 定义 binding 的名称;
type: 定义绑定的端口,对应:portType name="RemoteRevServiceImpl 。
wsdlsoap:binding中:
style:可取值 "rpc" 或 "document"。
transport :定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
operation: 定义了每个端口提供的操作符。 并对输入和输出进行编码。在这个例子中使用了 "literal"。
】
<wsdl:service name="RemoteRegvServiceImplService">
<wsdl:port binding="impl:OPMgetMDSDataSoapBinding" name="OPMgetMDSData">
<wsdlsoap: address location="http://14.2.33.94:9103/BSBOPM/services/OPMgetMDSData" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
3.查看wsdl的源文件:server-config.wsdd文件。如下:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl"/>
</globalConfiguration>
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper" />
<service name="RemoteRevWs" provider="java:RPC" style="rpc" use="literal">
<parameter name="className" value="com.rx.system.ws.service.impl.RemoteRevServiceImpl" />
<parameter name="allowedMethods" value="*" />
<beanMapping languageSpecificType="java:com.rx.system.ws.message.RequestBody"
qname="ns1:MessageBody"
xmlns:ns1="http://service.axis.com/da/"/>
<beanMapping languageSpecificType="java:com.rx.system.ws.message.ResponseBody"
qname="ns2:MessageBody"
xmlns:ns2="http://service.axis.com/da/"/>
【析:beanMapping:
languageSpecificType:javaBean的实体类路径。
qname:即限定名,是注明了命名空间的节点名字,格式:命名空间:本地名。(没有标注命名空间的
节点,属于非限定名。它有可能是属于缺省命名空间,如果缺省命名空间没有定义,则属于
无命名空间)在xml中元素和属性都是用qname表示的。
】
<typeMapping languageSpecificType="java:com.rx.system.ws.message.RequestBody"
name="ns1:MessageBody"
xmlns:ns1="http://service.axis.com/da/"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"/>
<typeMapping languageSpecificType="java:com.rx.system.ws.message.ResponseBody"
qname="ns2:MessageBody"
xmlns:ns2="http://service.axis.com/da/"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"/>
【析:typeMapping:
languageSepcificType,qname与beanMapping中的一要
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory:序列化的工厂类,
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory反序列化的工厂类。
(在调用方法中的registerTypeMapping会类似)
】
<namespace>http://service.axis.com/da/</namespace>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
</requestFlow>
</transport>
</deployment>
4.实体类
public class RequestBody implements Serializable{
private static final long servialVersionUID=1L;
private String jobTicket;
private String systemDate;
private String sendTime;
private String jobStatus;
......//此处省略set/get方法
}
public class ResponseBody implemens Serializable{
private static final long serialVersionUID=1L;
private String code;
private Sring rtnMsg;
public ResponseBody(){}
public ResponseBody(String code,String rtnMsg){
this.code=code;
this.rtnMsg=rtnMsg;
}
......//此处省略set/get方法
}
【注:实体类都实现了序列化接口(serializable),这样在网络中传递对象的时候就不会出现重复的JavaBean。】
5.调用接口方法类
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class TestSchedul{
public static void main(String[] args){
String eodPath="http://14.2.33.94:9103/BSBOPM/services/OPMgetMDSData";
//此eodPath:调用的webservice接口路径,可对应到发布的wsdl中的:address location。
Service service = new Service();
try{
//为要传入到接口的对象参数进行赋值,可对应到发布的wsdl中的:complexType MessageBody
RequestBody rb = new RequestBody();
rb.setJobStatu("Y");
rb.setJobTicket("12345678900987654321123456789000987654321");
rb.setSendTime("2014-10-21");
rb.setSystemDate("2014-10-21");
Call call = service.createCall();
call.setTimeOut(5000);
call.setTargetEndpointAddress(eodPath); //设置接口路径。
QName qn = new QName("http://service.axis.com/da/","MessageBody");
call.registerTypeMapping(
RequestBody.class,
qn,
new BeanSerializerFactory(RequestBody.class,qn),
new BeanDeserializerFacotry(RequestBody.class,qn)
); //这好似注册typeMapping
call.setOperationName("MessageHandler");
//设置操作名称,对应wsdl中的:wsdl:operation name="MessageHandler"
call.addParameter("MessageHandlerRequest",qn,ParameterMode.IN);
//添加参数:其格式为:参数名称,Qname,参数模式。
参数名称对应wsdl的<wsdl:input name="MessageHandlerRequest" />
/*若不需要读取返回对象的属性,则可以用如下代码:
call.setReturnClass(org.w3c.dom.Element.class);
Object pb = (Object)call.invoke(new Object[]{rb});
System.out.println("return type == " + pb.getClass().getName());
*/
//获取返回类型的值:通过<wsdl:output name="MessageHandlerResponse" />找到
<wsdl:message name="MessageHandlerRespnse">
<wsdl:part name="MessageHandlerReturn" type="impl:MessageBody">
</wsdl:message>
QName returnQn = new QName("http://service.axis.com/da/","MessageHandlerReturn");
call.registerTypeMapping(
ResponseBody.class,
returnQn,
new BeanSerializerFactory(ResponseBody.class,returnQn),
new BeqanDeserializerFactory(ResponseBody.class,returnQn)
);
call.setReturnType(returnQn,ResponseBody.class);//对应registerTypeMapping
ResponseBody pb =(ResponseBody)call.invoke(new Object[]{rb});//调用接口
System.out.println("see the return value = " + pb.getRtnMsg());
}catch(Exception e){
e.printStackTrace();
}
}
}
//资料链接:
http://www.w3cschool.cn/wsdl_binding.html :简单的wsdl介绍
java:浅谈axis调用webservice接口相关推荐
- java:AXIS调用webService接口,返回String类型xml,并用dom4j简单解析xml
一.使用axis调用webService接口,返回String类型xml 1.导入axis依赖 2.直接贴代码 /*** 调用webservice接口的方法,并返回String类型的xml* @par ...
- 利用axis调用webservice接口
package test;import javax.xml.namespace.QName;import org.apache.axis.client.Call; import org.apache. ...
- JAVA中使用XFire调用WebService接口
http://blog.csdn.net/wangjian223344/article/details/11899187 首先以helloworld为例.网上看了好多xifre的例子几乎没好用的烦燥 ...
- java使用axis调用webservice接口
1.导jar包 <!-- https://mvnrepository.com/artifact/org.apache.axis/axis --><dependency>< ...
- java 详细教程AXIS调用webservice(直接上代码)
今天遇到一个对接web service的需求,因为之前没有对接过,踩了不少坑,今天我来分享一下本次对接的经验 SOAP 1.1 以下是 SOAP 1.2 请求和响应示例.所显示的占位符需替换为实际值. ...
- java axisclient超时_调用webservice接口超时
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Exception in thread "main" AxisFault faultCode: {http://schemas.xml ...
- java用axis方式调用webservice接口
最近需要使用webservice接口,所以总结了一下全过程,希望能够对大家有所帮助. 开发使用的项目框架是ssm框架,tomcat服务器. 首先我们会拿到一个调用webservice接口的网址,类似这 ...
- java使用axis实现webservice接口调用
看了很多博客,发现都是cp出来说明也不清楚.不是缺包就是少代码,一贴就不负责任.自己最后找到了方法,写一个比较完整的方法给大家提供. 确保webservice接口可以在网页进行访问,调用webserv ...
- Java,Axis方式调用WebService接口,支持多参数
package com.demo.modules.si.util;import org.apache.axis.client.Call; import javax.xml.rpc.ParameterM ...
最新文章
- 使用图片方式自定义iOS导航栏navigationItem的backBarButtonItem
- python扫雷代码_室友扫雷通关来炫耀!我用Python做出自动扫雷十秒通关!
- iOS8 【xcode6中添加pch全局引用文件】
- apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
- 信息学奥赛C++语言:插队问题
- 配置交换空间与文件系统的备份
- C#窗体控件-文本框控件TextBox
- Linux vi 进去命令模式,Linux 下 vi/vim 文本编辑器详细命令使用方法,linux的vi/vim命令vi/vim命令模式,输入模式和末行模式...
- 数列极限:数列极限的性质
- IDEA破解码(至2099)
- SCC4-设置系统是否可编辑状态(后台配置)
- 气温和降水空间栅格数据下载RS123
- mysql查询出现ambiguous的问题
- 软件开发管理之:编码负责人及标准代码库机制(转)--有同样的想法
- Android kernel中wakeup_sources解析
- 北京地铁月度消费总金额计算(Python版)
- Simulink系列 —— S-function的使用笔记(1)
- 蓝牙追踪_如何使用蓝牙追踪器跟踪您的东西
- nmap简单实用命令
- 系统部署服务器位置,室内定位系统在实际项目中的部署
热门文章
- 多媒体计算机中发出声音有两种来源,多媒体计算机的声音信息处理.pdf
- Visio另存为pdf字符间距变化等字母间距的问题
- VSCode插件之实时字数统计与选中词英汉互译
- vue2对应的常用插件版本
- 自动化运维之系统安装部署
- Spark报错:Error:scalac: Scala compiler JARs not found (module ‘Spark_two‘): C:\Users\沫小新\.m2\repo
- java注解 @Target和@Retention详解
- python实现cv2图片读取显示及图片不显示或显示不全的问题分析
- Python项目代码结构详解
- 超大XML文件怎么打开