Java写 soapclient_Java for Web学习笔记(一一八):【篇外】Soap client
使用Eclipse自动生成Soap Client的代码
在项目按右键,选择New -> Other ->Web Services -> Web Service Client,进入向导。
加入自有代码,例如加入Envelope Header
在xxxxStub.java文件相应的方法中加入:
public com.example.api.ApiStatus.EchoResponse echo(com.example.api.ApiStatus.Echo echo) throws java.rmi.RemoteException {
if (super.cachedEndpoint == null) {
throw new org.apache.axis.NoEndPointException();
}
org.apache.axis.client.Call _call = createCall();
_call.setOperation(_operations[0]);
_call.setUseSOAPAction(true);
_call.setSOAPActionURI("");
_call.setEncodingStyle(null);
_call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
_call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
_call.setOperationName(new javax.xml.namespace.QName("", "echo"));
setRequestHeaders(_call);
setAttachments(_call);
//这里是加入的Header的内容
SoapUtils.addAuthSoapHeader(_call);
try {
。。。。。。
public class SoapUtils {
private static final Logger log = LogManager.getLogger();
private static SOAPFactory soapFactory;
static{
try {
soapFactory = SOAPFactory.newInstance();
} catch (SOAPException e) {
log.fatal("[FATAL] create SOAP Factory error : {}",e.toString());
}
}
//参考http://blog.csdn.net/oscar999/article/details/40340819
private static SOAPHeaderElement createDcpSoapHeader(String userName, String password){
try {
String AUTH_PREFIX = "wsse";
String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
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);
userNameElm.addTextNode(userName);
passwdElm.addTextNode(password);
userNameTokenElm.addChildElement(userNameElm);
userNameTokenElm.addChildElement(passwdElm);
wsSecHeaderElm.addChildElement(userNameTokenElm);
SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(wsSecHeaderElm);
soapHeaderElement.setMustUnderstand(true);
return soapHeaderElement;
} catch (Exception e) {
return null;
}
}
public static void addAuthSoapHeader(org.apache.axis.client.Call call,String userName, String password){
SOAPHeaderElement header = createDcpSoapHeader(userName,password);
if(header != null)
call.addHeader(header);
}
}
更好的方式还可以参考 Web Service SOAP Client 设置 SOAP Header,那里给出更通用的解决方式,而这里需要对每个接口都进行设置。主要是了解一下soap client的代码。
网络出现问题,多次重发的实现
利用Java的Function类,在SoapUtils实现通用的多次重发方法。
public class SoapUtils {
private static final Logger log = LogManager.getLogger();
......
//在log上显示错误,并判断是否因为网络连接问题而需要重复
public static boolean showAndCheckRetryEAxisFault(Exception e){
if( e instanceof ConnectException)
return true;
if( e instanceof AxisFault){
AxisFault fault = (AxisFault)e;
if(fault.getFaultString().startsWith("java.net.ConnectException"))
return true;
log.error( fault.dumpToString());
return false;
}
return false;
}
//在log上显示错误
public static void showAxisFault(Exception e){
if( e instanceof AxisFault){
AxisFault fault = (AxisFault)e;
log.error( fault.dumpToString());
}
}
// 根据重复后退的retriesDelay参数,在网络出现故障时,进行重复。其中SoapUtils.ThrowingFunction func就是soap proxy中的具体某个方法。这个func因为抛出异常,不能直接使用Function,需要通过ThrowingFunction extends Function来实现。
public static R funcApplyWithThrow(SoapUtils.ThrowingFunction func,T param, Long ... retriesDelay) throws AxisFault,Exception{
if(retriesDelay != null){
for(int i = 0 ; i< retriesDelay.length ; i ++){
try {
return func.applyThrows(param);
} catch (Exception e) {
if(!SoapUtils.showAndCheckRetryEAxisFault(e))
throw e;
log.debug("Try to fix {}, resend({}) after {}ms", e.toString(), i+1, retriesDelay[i]);
}
NormalUtils.sleep(retriesDelay[i]);
}
}
try{
return func.applyThrows(param);
}catch(Exception e){
SoapUtils.showAxisFault(e);
throw e;
}
}
//参考slieb.org/blog/throwable-interfaces/
@FunctionalInterface
public static interface ThrowingFunction extends Function {
@Override
default R apply(T t){
try{
return applyThrows(t);
}catch (RemoteException e){
throw new RuntimeException(e);
}
}
R applyThrows(T t) throws RemoteException;
}
}
具体某个重发的实现:
private final MySoapProxy proxy = new MySoapProxy(url);
@Override
public QueryResponse query(Long ...retriesDelay) throws AxisFault,Exception{
QueryParam param = new QueryParam();
return SoapUtils.funcApplyWithThrow(proxy::query, param, retriesDelay);
}
Java写 soapclient_Java for Web学习笔记(一一八):【篇外】Soap client相关推荐
- Cty的Linux学习笔记(八)
Linux学习笔记--第八篇 命令(command): groupadd: 新增组的命令 格式:groupadd [-g GID] groupname 不加-g,按照系统默认的gid创建组,gid也是 ...
- java web学习笔记(持续更新)
java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...
- 2019年Java Web学习笔记目录
Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- 拉勾网《32个Java面试必考点》学习笔记之十二------架构演进与容器技术
本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java开发面试高频考点学习笔记(每日更新)
Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...
- Java学习笔记之基础篇
Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...
- 【慕课网】Web学习笔记———CSS3 (一)
[Web学习笔记]CSS3 (一) CSS3代码语法 CSS注释代码 CSS样式 内联式css样式 嵌入式css样式 外部式css样式 权值 CSS3选择器 标签选择器 类选择器 ID选择器 类与ID ...
最新文章
- SharePoint基础之六- SharePoint基础架构中涉及的ASP.NET架构
- Python基础教程(十一):多线程、XML解析
- django存入mysql数据库_django如何存数据到一个mysql数据表里面
- centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权
- 获取activemq 队列所有数据_ActiveMQ的应用
- pandas 读取某一单元格的值_一个参数一个Excel表,让你玩转Pandas中read_excel()表格读取!...
- 在rhel6 64位环境下部署LNMP环境
- 2021线报天下 原创工具 (免费版本,无版权问题)
- 乱下东西导致挖矿病毒Trojan,CoinMiner的解决记录
- 2021-3-4大学化学无机化学原理(1)理想气体的状态方程和分压定律
- 前端,网页设计常用色彩搭配表
- sdnu oj 1357.Text Reverse 字符串
- poi导出Excel合并单元格、设置打印参数页眉页脚等
- LTD营销SaaS-官微云代理商加盟服务
- mapping文件的编写
- 圣迭戈与哥大电子计算机,加州大学圣迭戈分校
- tomcat端口占用极其简单解决办法
- 时间复杂度和空间复杂度及多道例题讲解
- Java 2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示输入用户磅数,然后转换为千克并显示结果。一磅等于0.454千克。下面是一个运行示例:
- 计算机3d影视的应用程序,计算机3D技术在电影中的应用