【申明:此代码已经经过测试可以正确使用;但内容解释为个人见解,如有不准确之处,请指教。

             阅读前请先仔细阅读“【】”中的说明文字,以免与您的需求不符而浪费时间。】

【前提:对方给了一个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接口相关推荐

  1. java:AXIS调用webService接口,返回String类型xml,并用dom4j简单解析xml

    一.使用axis调用webService接口,返回String类型xml 1.导入axis依赖 2.直接贴代码 /*** 调用webservice接口的方法,并返回String类型的xml* @par ...

  2. 利用axis调用webservice接口

    package test;import javax.xml.namespace.QName;import org.apache.axis.client.Call; import org.apache. ...

  3. JAVA中使用XFire调用WebService接口

    http://blog.csdn.net/wangjian223344/article/details/11899187 首先以helloworld为例.网上看了好多xifre的例子几乎没好用的烦燥 ...

  4. java使用axis调用webservice接口

    1.导jar包 <!-- https://mvnrepository.com/artifact/org.apache.axis/axis --><dependency>< ...

  5. java 详细教程AXIS调用webservice(直接上代码)

    今天遇到一个对接web service的需求,因为之前没有对接过,踩了不少坑,今天我来分享一下本次对接的经验 SOAP 1.1 以下是 SOAP 1.2 请求和响应示例.所显示的占位符需替换为实际值. ...

  6. java axisclient超时_调用webservice接口超时

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Exception in thread "main" AxisFault faultCode: {http://schemas.xml ...

  7. java用axis方式调用webservice接口

    最近需要使用webservice接口,所以总结了一下全过程,希望能够对大家有所帮助. 开发使用的项目框架是ssm框架,tomcat服务器. 首先我们会拿到一个调用webservice接口的网址,类似这 ...

  8. java使用axis实现webservice接口调用

    看了很多博客,发现都是cp出来说明也不清楚.不是缺包就是少代码,一贴就不负责任.自己最后找到了方法,写一个比较完整的方法给大家提供. 确保webservice接口可以在网页进行访问,调用webserv ...

  9. Java,Axis方式调用WebService接口,支持多参数

    package com.demo.modules.si.util;import org.apache.axis.client.Call; import javax.xml.rpc.ParameterM ...

最新文章

  1. 使用图片方式自定义iOS导航栏navigationItem的backBarButtonItem
  2. python扫雷代码_室友扫雷通关来炫耀!我用Python做出自动扫雷十秒通关!
  3. iOS8 【xcode6中添加pch全局引用文件】
  4. apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
  5. 信息学奥赛C++语言:插队问题
  6. 配置交换空间与文件系统的备份
  7. C#窗体控件-文本框控件TextBox
  8. Linux vi 进去命令模式,Linux 下 vi/vim 文本编辑器详细命令使用方法,linux的vi/vim命令vi/vim命令模式,输入模式和末行模式...
  9. 数列极限:数列极限的性质
  10. IDEA破解码(至2099)
  11. SCC4-设置系统是否可编辑状态(后台配置)
  12. 气温和降水空间栅格数据下载RS123
  13. mysql查询出现ambiguous的问题
  14. 软件开发管理之:编码负责人及标准代码库机制(转)--有同样的想法
  15. Android kernel中wakeup_sources解析
  16. 北京地铁月度消费总金额计算(Python版)
  17. Simulink系列 —— S-function的使用笔记(1)
  18. 蓝牙追踪_如何使用蓝牙追踪器跟踪您的东西
  19. nmap简单实用命令
  20. 系统部署服务器位置,室内定位系统在实际项目中的部署

热门文章

  1. 多媒体计算机中发出声音有两种来源,多媒体计算机的声音信息处理.pdf
  2. Visio另存为pdf字符间距变化等字母间距的问题
  3. VSCode插件之实时字数统计与选中词英汉互译
  4. vue2对应的常用插件版本
  5. 自动化运维之系统安装部署
  6. Spark报错:Error:scalac: Scala compiler JARs not found (module ‘Spark_two‘): C:\Users\沫小新\.m2\repo
  7. java注解 @Target和@Retention详解
  8. python实现cv2图片读取显示及图片不显示或显示不全的问题分析
  9. Python项目代码结构详解
  10. 超大XML文件怎么打开