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. iptables详解(2)表中规则管理(增删改查)

    我们定义了四张表:raw表.mangle表.nat表.filter表,不同的表有不同的功能 filter表用来过滤,允许哪些ip.端口访问,禁止哪些ip.端口访问,表中会有很多链 ①禁止ip地址访问我 ...

  2. Windows下无法新建文件夹

    原文链接:https://www.jianshu.com/p/ee3205d5b9c9

  3. php多版本配置

    需求分析: 需要在一台装有php5.4的测试服务器跑的上php7.2.x的项目 安装phpenv(php版本控制) $ sudo yum install git $ mkdir -p repos/gi ...

  4. AJAX学习笔记——跨域

    跨域 一个域名地址的组成 http:// www abc.com : 8080 / scripts/jquery.js 协议 子域名 主域名 端口号 请求资源地址 端口号:一般来说域名端口号是80,如 ...

  5. python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )

    1.  start_urls  --  起始URL 的内部实现(将迭代器转换为生成器) class QSpider(scrapy.Spider): name = 'q' allowed_domains ...

  6. 14 Vue列表渲染

    列表渲染 用 v-for 把一个数组对应为一组元素(for循环) 我们可以用 v-for 指令基于一个数组来渲染一个列表. v-for 指令需要使用 item in items 形式的特殊语法, 其中 ...

  7. hadoop各版本下载地址

    http://mirror.bit.edu.cn/apache/hadoop/common/

  8. 005_Python3 运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算 ...

  9. 057_统计 Linux 进程相关数量信息

    #!/bin/bashrunning=0sleeping=0stoped=0zombie=0 #在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程 PID#每个 PID 编号的目录 ...

  10. pytz

    pytz django的模型类中使用的 DateTimeField 字段,自动添加下来的携带有时区信息,2019-06-19T03:58:11.937945Z 在我的逻辑中需要对时间进行比较,我使用了 ...