Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下。

一:背景

同事给了我一个webservice地址,打开后后缀是"...?wsdl",将链接"http://......?wsdl"放入soapUI中,可以解析出完整的。但是Neo君之前对这边是空白的,上网搜索了一些webservice和soap以及wsdl的基本知识后,才了解了一些。但是具体到代码里使用,网上搜到的内容好多都是copy的,且不完整。

二:Code

话不多说,中间走过的弯路一并带过,直接贴代码。

 import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.MessageElement;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.types.Schema;
import org.dom4j.Document;
import org.dom4j.io.SAXReader; import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import java.io.ByteArrayInputStream; public class WebserviceUtilTest {
public static void main(String[] args) {
try{
String endpoint="http://xxx";
// 直接引用远程的wsdl文件,"?wsdl"前的链接
String method="test";
String namespace = "http://www.xxxx"; Service service = new Service();
Call call = (Call) service.createCall();
//设置服务器地址
call.setTargetEndpointAddress(new java.net.URL(endpoint));
//设置命名空间和调用方法
call.setOperationName(new QName(namespace,method));// WSDL里面描述的接口名称
call.setUseSOAPAction(true); //设置header,如果有security需求的话
SOAPHeaderElement soapHeaderElement = createHeader();
if(soapHeaderElement == null){
System.out.println("====Exception");
return;
}
call.addHeader(soapHeaderElement); //添加方法的参数,有几个添加几个
call.addParameter("param1", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("param2", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的参数
//设置返回类型 /*返回类型可以不设置,如果是简单类型可以使用XMLType.XSD_STRING等简单类型,这里使用schema解析返回的报文。
如果接收的类型和设置的类型不一致,会报以下异常:
SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.*/
call.setReturnType(XMLType.XSD_SCHEMA);// 设置返回类型 String param1Value = "test";
String param2Value = "test";
Schema result = (Schema) call.invoke(new Object[] { account,passwd }); //解析返回结果
MessageElement[] data = result.get_any();
for(int i=0; i<data.length; i++){
SAXReader reader = new SAXReader();
Document doc = reader.read(new ByteArrayInputStream(data[i].toString().getBytes()));
System.out.println(doc.getStringValue());
} //输出SOAP请求报文
System.out.println("--SOAP Request: " + call.getMessageContext().getRequestMessage().getSOAPPartAsString());
//输出SOAP返回报文
System.out.println("--SOAP Response: " + call.getResponseMessage().getSOAPPartAsString()); }catch (Exception e){
e.printStackTrace(); }
}
/*构造Header*/
public static SOAPHeaderElement createHeader(){
String AUTH_PREFIX = "wsse";
String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
String TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; String userName= "admin";
String passwd= "admin"; //SOAPHeaderElement soapHeaderElement =new SOAPHeaderElement(); try{
SOAPFactory soapFactory =SOAPFactory.newInstance();
SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS);
SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken",AUTH_PREFIX, AUTH_NS);
SOAPElement userNameElm = soapFactory.createElement("Username",AUTH_PREFIX, AUTH_NS);
SOAPElement passwdElm = soapFactory.createElement("Password",AUTH_PREFIX, AUTH_NS);
passwdElm.setAttribute("Type", TYPE); userNameElm.addTextNode(userName);
passwdElm.addTextNode(passwd); userNameTokenElm.addChildElement(userNameElm);
userNameTokenElm.addChildElement(passwdElm);
wsSecHeaderElm.addChildElement(userNameTokenElm); SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(wsSecHeaderElm);
soapHeaderElement.setMustUnderstand(true); return soapHeaderElement;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}

Webservice初体验:axis调用wsdl和document解析的更多相关文章

  1. 使用Android Studio开发调用.NET Webservice 之初体验

    本人是.NET出身 但苦于领导要让研究Android 外壳然后准备套html5  ,当试验兵真坑啊 但也没办法 咱还得研究啊,索性 不辜负领导的期望(也研究好两三天了)总算弄明白了 app本地存储 和 ...

  2. Java通过axis调用WebService

    上午头给了我一个任务,让我对接别的公司的webservice接口,各种百度,看的头晕脑花的,终于通了,记录一下吧. jar包奉上,http://pan.baidu.com/s/1jSchC 包含:ax ...

  3. (转)Java通过axis调用WebService

    转自:http://blog.csdn.net/wanglha/article/details/49679825 转载地址:http://www.linuxidc.com/Linux/2015-06/ ...

  4. 使用axis调用WebService服务端

    由于项目中要调用其他公司的接口,研究了下axis调用webService这种方式,现将代码贴出,以备以后查阅: package com.xbq; import javax.xml.namespace. ...

  5. Java调用WebService方法总结(4)--Axis调用WebService

    Axis是比较常用的WebService框架,该项目在2006实现了最终版,后面就没有更新了.文中demo所使用到的软件版本:Java 1.8.0_191.Axis 1.4. 1.准备 参考Java调 ...

  6. java axis调用带有soap头(soapheader)的.net webservice

    使用axis调用.net带soapheader的webservice是如何实现的,现在贴出代码 <?xml version="1.0" encoding="utf- ...

  7. Java通过axis调用.NET WebService

    前面已经记录过通过axis调用webservice,昨天在对接.NET接口时,发现在传递参数时和一般的传参方法是不一样的,在接口方哥们的帮助下解决了.哈哈. import java.net.URL; ...

  8. 采用WebService客户端调用WSDL/SOAP网络报错的解决办法

    WebService接口是网络传输控制的重要途径,在Windows系统下运行客户端时,平时一直能正确运行,但某天可能突然会发生调用wsdl soap邮件标头无法识别等莫名其妙的错误提示,出现这种情况一 ...

  9. Dapr初体验之服务调用

    初次理解服务调用 在微服务中,有一个难点就是:如果你想使用各个服务组件,你就得知道不同服务的地址和端口,也就是服务发现. 在传统应用我们是怎么做的?就是在web项目里配置上api地址,如下: 在一个w ...

随机推荐

  1. spark 实现多文件输出

    需求 不同的key输出到不同的文件 txt文件 multiple.txt 中国;22 美国;4342 中国;123 日本;44 日本;6 美国;55 美国;43765 日本;786 日本;55 sca ...

  2. kubbernetes Flannel网络部署(五)

    一.Flannel生成证书 1.创建Flannel生成证书的文件 [root@linux-node1 ~]# vim flanneld-csr.json { "CN": " ...

  3. datatable修改每页默认显示的数量

    datatable修改每页默认显示的数量 一.总结 一句话总结: iDisplayLength属性:'iDisplayLength':50 1.datatable默认每页显示50个? iDisplay ...

  4. 1127 模型层orm表操作

    目录 昨日回顾 模型层 1.配置测试脚本 1.1 应用下tests文件 1.2 新建任意名称文件 2. 数据的增删改查 2.1 创建数据 2.2 修改数据 2.3 删除数据 2.4查询数据 十三门徒 ...

  5. webpack4 打包优化

    1 参考文章 彻底解决 webpack 打包文件体积过大 webpack4提升180%编译速度 详解webpack4之splitchunksPlugin代码包分拆 webpack v4 中的断舍离 开 ...

  6. vue+webpack4 脚手架搭建

    1, vue 中 h => h(App) 的含义: //render: h => h(App) 是下面内容的缩写: render: function (createElement) { r ...

  7. ModbusRTU模式和结束符(转)

    Modbus RTU模式的协议字段 起始位 设备地址 功能码 数据 CRC校验 结束符 至少3.5个字符 8bit 8bit N*8bit 16bit 至少3.5个字符 Modbus协议RTU模式要求 ...

  8. C# TreeView 右键菜单

    方法一: 在winform中,添加一个contextMenuStrip1,设置TreeView的属性ContextMenuStrip为contextMenuStrip1,并为这个contextMenu ...

  9. BZOJ4543 Hotel加强版(长链剖分)

    题意 求一棵树上,两两距离相等的三个点的三元组(无序)的个数. 题解 转自 CaptainHarryChen 的博客 CODE 代码中的f,gf,gf,g对应题解中的num,waynum,waynum ...

  10. 作业调度系统PBS(Torque)的设置

    1.修改/var/spool/torque/server_priv/目录下的nodes文件 Node1 np=16 gpus=4 Node2 np=16 gpus=4 ... 其中Node1为计算节点 ...