diff --git a/CHANGELOG.md b/CHANGELOG.md index 828a6e32a..63e117a6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * 【core】 FileUtil.normalize在win下支持samba路径(issue#549@Github) * 【core】 修复Validator注释错误(pr#70@Gitee) * 【cron】 添加获取任务表的方法(issue#I12E5H@Gitee) +* 【http】 SoapClient增加reset方法用于此对象的复用(issue#I12CCC@Gitee) ### Bug修复 * 【core】 修复DateUtil.offset导致的时区错误问题(issue#I1294O@Gitee) diff --git a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java index 30225257d..7bcf0ffb7 100644 --- a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java +++ b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java @@ -32,35 +32,70 @@ import cn.hutool.http.HttpResponse; /** * SOAP客户端 - * + * + *
+ * 此对象用于构建一个SOAP消息,并通过HTTP接口发出消息内容。 + * SOAP消息本质上是一个XML文本,可以通过调用{@link #getMsgStr(boolean)} 方法获取消息体 + *
+ * 使用方法: + * + *
+ * SoapClient client = SoapClient.create(url) + * .setMethod(methodName, namespaceURI) + * .setCharset(CharsetUtil.CHARSET_GBK) + * .setParam(param1, "XXX"); + * + * String response = client.send(true); + * + *+ * * @author looly * @since 4.5.4 */ public class SoapClient { - /** XML消息体的Content-Type */ + /** + * XML消息体的Content-Type + */ private static final String TEXT_XML_CONTENT_TYPE = "text/xml;charset="; - /** 请求的URL地址 */ + /** + * 请求的URL地址 + */ private String url; - /** 编码 */ + /** + * 编码 + */ private Charset charset = CharsetUtil.CHARSET_UTF_8; - /** SOAP消息 */ - private SOAPMessage message; - /** 消息方法节点 */ - private SOAPBodyElement methodEle; - /** 应用于方法上的命名空间URI */ - private String namespaceURI; - /** 消息工厂,用于创建消息 */ - private MessageFactory factory; - /** 默认连接超时 */ + /** + * 默认连接超时 + */ private int connectionTimeout = HttpGlobalConfig.getTimeout(); - /** 默认读取超时 */ + /** + * 默认读取超时 + */ private int readTimeout = HttpGlobalConfig.getTimeout(); + /** + * 消息工厂,用于创建消息 + */ + private MessageFactory factory; + /** + * SOAP消息 + */ + private SOAPMessage message; + /** + * 消息方法节点 + */ + private SOAPBodyElement methodEle; + /** + * 应用于方法上的命名空间URI + */ + private String namespaceURI; + /** * 创建SOAP客户端,默认使用soap1.1版本协议 - * + * * @param url WS的URL地址 * @return {@link SoapClient} */ @@ -70,8 +105,8 @@ public class SoapClient { /** * 创建SOAP客户端 - * - * @param url WS的URL地址 + * + * @param url WS的URL地址 * @param protocol 协议,见{@link SoapProtocol} * @return {@link SoapClient} */ @@ -81,9 +116,9 @@ public class SoapClient { /** * 创建SOAP客户端 - * - * @param url WS的URL地址 - * @param protocol 协议,见{@link SoapProtocol} + * + * @param url WS的URL地址 + * @param protocol 协议,见{@link SoapProtocol} * @param namespaceURI 方法上的命名空间URI * @return {@link SoapClient} * @since 4.5.6 @@ -94,7 +129,7 @@ public class SoapClient { /** * 构造,默认使用soap1.1版本协议 - * + * * @param url WS的URL地址 */ public SoapClient(String url) { @@ -103,8 +138,8 @@ public class SoapClient { /** * 构造 - * - * @param url WS的URL地址 + * + * @param url WS的URL地址 * @param protocol 协议版本,见{@link SoapProtocol} */ public SoapClient(String url, SoapProtocol protocol) { @@ -113,9 +148,9 @@ public class SoapClient { /** * 构造 - * - * @param url WS的URL地址 - * @param protocol 协议版本,见{@link SoapProtocol} + * + * @param url WS的URL地址 + * @param protocol 协议版本,见{@link SoapProtocol} * @param namespaceURI 方法上的命名空间URI * @since 4.5.6 */ @@ -127,7 +162,7 @@ public class SoapClient { /** * 初始化 - * + * * @param protocol 协议版本枚举,见{@link SoapProtocol} * @return this */ @@ -144,9 +179,29 @@ public class SoapClient { return this; } + /** + * 重置SOAP客户端,用于客户端复用 + * + *
+ * 重置后需调用serMethod方法重新指定请求方法,并调用setParam方法重新定义参数
+ *
+ * @return this
+ * @since 4.6.7
+ */
+ public SoapClient reset() {
+ try {
+ this.message = factory.createMessage();
+ } catch (SOAPException e) {
+ throw new SoapRuntimeException(e);
+ }
+ this.methodEle = null;
+
+ return this;
+ }
+
/**
* 设置编码
- *
+ *
* @param charset 编码
* @return this
*/
@@ -158,13 +213,13 @@ public class SoapClient {
} catch (SOAPException e) {
// ignore
}
-
+
return this;
}
/**
* 设置Webservice请求地址
- *
+ *
* @param url Webservice请求地址
* @return this
*/
@@ -175,7 +230,7 @@ public class SoapClient {
/**
* 设置头信息
- *
+ *
* @param name 头信息标签名
* @return this
*/
@@ -185,12 +240,12 @@ public class SoapClient {
/**
* 设置头信息
- *
- * @param name 头信息标签名
- * @param actorURI 中间的消息接收者
- * @param roleUri Role的URI
+ *
+ * @param name 头信息标签名
+ * @param actorURI 中间的消息接收者
+ * @param roleUri Role的URI
* @param mustUnderstand 标题项对于要对其进行处理的接收者来说是强制的还是可选的
- * @param relay relay属性
+ * @param relay relay属性
* @return this
*/
public SoapClient setHeader(QName name, String actorURI, String roleUri, Boolean mustUnderstand, Boolean relay) {
@@ -221,9 +276,9 @@ public class SoapClient {
/**
* 设置请求方法
- *
- * @param name 方法名及其命名空间
- * @param params 参数
+ *
+ * @param name 方法名及其命名空间
+ * @param params 参数
* @param useMethodPrefix 是否使用方法的命名空间前缀
* @return this
*/
@@ -233,9 +288,9 @@ public class SoapClient {
/**
* 设置请求方法
- *
- * @param name 方法名及其命名空间
- * @param params 参数
+ *
+ * @param name 方法名及其命名空间
+ * @param params 参数
* @param useMethodPrefix 是否使用方法的命名空间前缀
* @return this
*/
@@ -254,7 +309,7 @@ public class SoapClient {
* 设置请求方法
* 方法名自动识别前缀,前缀和方法名使用“:”分隔
* 当识别到前缀后,自动添加xmlns属性,关联到默认的namespaceURI
- *
+ *
* @param methodName 方法名
* @return this
*/
@@ -266,8 +321,8 @@ public class SoapClient {
* 设置请求方法
* 方法名自动识别前缀,前缀和方法名使用“:”分隔
* 当识别到前缀后,自动添加xmlns属性,关联到传入的namespaceURI
- *
- * @param methodName 方法名(可有前缀也可无)
+ *
+ * @param methodName 方法名(可有前缀也可无)
* @param namespaceURI 命名空间URI
* @return this
*/
@@ -284,7 +339,7 @@ public class SoapClient {
/**
* 设置请求方法
- *
+ *
* @param name 方法名及其命名空间
* @return this
*/
@@ -300,8 +355,8 @@ public class SoapClient {
/**
* 设置方法参数,使用方法的前缀
- *
- * @param name 参数名
+ *
+ * @param name 参数名
* @param value 参数值,可以是字符串或Map或{@link SOAPElement}
* @return this
*/
@@ -311,9 +366,9 @@ public class SoapClient {
/**
* 设置方法参数
- *
- * @param name 参数名
- * @param value 参数值,可以是字符串或Map或{@link SOAPElement}
+ *
+ * @param name 参数名
+ * @param value 参数值,可以是字符串或Map或{@link SOAPElement}
* @param useMethodPrefix 是否使用方法的命名空间前缀
* @return this
*/
@@ -324,7 +379,7 @@ public class SoapClient {
/**
* 批量设置参数,使用方法的前缀
- *
+ *
* @param params 参数列表
* @return this
* @since 4.5.6
@@ -335,8 +390,8 @@ public class SoapClient {
/**
* 批量设置参数
- *
- * @param params 参数列表
+ *
+ * @param params 参数列表
* @param useMethodPrefix 是否使用方法的命名空间前缀
* @return this
* @since 4.5.6
@@ -351,7 +406,7 @@ public class SoapClient {
/**
* 获取方法节点
* 用于创建子节点等操作
- *
+ *
* @return {@link SOAPBodyElement}
* @since 4.5.6
*/
@@ -361,7 +416,7 @@ public class SoapClient {
/**
* 获取SOAP消息对象 {@link SOAPMessage}
- *
+ *
* @return {@link SOAPMessage}
* @since 4.5.6
*/
@@ -371,17 +426,17 @@ public class SoapClient {
/**
* 获取SOAP请求消息
- *
+ *
* @param pretty 是否格式化
* @return 消息字符串
*/
public String getMsgStr(boolean pretty) {
return SoapUtil.toString(this.message, pretty, this.charset);
}
-
+
/**
* 将SOAP消息的XML内容输出到流
- *
+ *
* @param out 输出流
* @return this
* @since 4.5.6
@@ -394,16 +449,16 @@ public class SoapClient {
}
return this;
}
-
+
/**
* 设置超时,单位:毫秒
* 超时包括:
- *
+ *
*
* 1. 连接超时 * 2. 读取响应超时 *- * + * * @param milliseconds 超时毫秒数 * @return this * @see #setConnectionTimeout(int) @@ -417,7 +472,7 @@ public class SoapClient { /** * 设置连接超时,单位:毫秒 - * + * * @param milliseconds 超时毫秒数 * @return this * @since 4.5.6 @@ -429,7 +484,7 @@ public class SoapClient { /** * 设置连接超时,单位:毫秒 - * + * * @param milliseconds 超时毫秒数 * @return this * @since 4.5.6 @@ -438,17 +493,17 @@ public class SoapClient { this.readTimeout = milliseconds; return this; } - + /** * 执行Webservice请求,既发送SOAP内容 - * + * * @return 返回结果 */ public SOAPMessage sendForMessage() { final HttpResponse res = sendForResponse(); final MimeHeaders headers = new MimeHeaders(); for (Entry