diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ec4054be..4214a3b64 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,10 @@
### 新特性
* 【core】 ImgUtil.rotate支持负数(issue#543@Github)
+* 【http】 body方法传null跳过而非报错(issue#I12AP2@Github)
+* 【core】 TimeInterval增加intervalPretty方法(issue#I12A6T@Github)
### Bug修复
+* 【core】 修复DateUtil.offset导致的时区错误问题(issue#I1294O@Github)
-------------------------------------------------------------------------------------------------------------
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java
index 4ed4b9bdb..83922c695 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java
@@ -17,23 +17,28 @@ import cn.hutool.core.util.StrUtil;
/**
* 包装java.util.Date
- *
- * @author xiaoleilu
*
+ * @author xiaoleilu
*/
public class DateTime extends Date {
private static final long serialVersionUID = -5395712593979185936L;
- /** 是否可变对象 */
+ /**
+ * 是否可变对象
+ */
private boolean mutable = true;
- /** 一周的第一天,默认是周一, 在设置或获得 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段时,Calendar 必须确定一个月或一年的第一个星期,以此作为参考点。 */
+ /**
+ * 一周的第一天,默认是周一, 在设置或获得 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段时,Calendar 必须确定一个月或一年的第一个星期,以此作为参考点。
+ */
private Week firstDayOfWeek = Week.MONDAY;
- /** 时区 */
+ /**
+ * 时区
+ */
private TimeZone timeZone;
-
+
/**
* 转换时间戳为 DateTime
- *
+ *
* @param timeMillis 时间戳,毫秒数
* @return DateTime
* @since 4.6.3
@@ -44,7 +49,7 @@ public class DateTime extends Date {
/**
* 转换JDK date为 DateTime
- *
+ *
* @param date JDK Date
* @return DateTime
*/
@@ -57,7 +62,7 @@ public class DateTime extends Date {
/**
* 转换 {@link Calendar} 为 DateTime
- *
+ *
* @param calendar {@link Calendar}
* @return DateTime
*/
@@ -67,11 +72,11 @@ public class DateTime extends Date {
/**
* 构造
- *
- * @see DatePattern
+ *
* @param dateStr Date字符串
- * @param format 格式
+ * @param format 格式
* @return {@link DateTime}
+ * @see DatePattern
*/
public static DateTime of(String dateStr, String format) {
return new DateTime(dateStr, format);
@@ -79,7 +84,7 @@ public class DateTime extends Date {
/**
* 现在的时间
- *
+ *
* @return 现在的时间
*/
public static DateTime now() {
@@ -87,9 +92,9 @@ public class DateTime extends Date {
}
// -------------------------------------------------------------------- Constructor start
+
/**
* 当前时间
- *
*/
public DateTime() {
this(TimeZone.getDefault());
@@ -97,7 +102,7 @@ public class DateTime extends Date {
/**
* 当前时间
- *
+ *
* @param timeZone 时区
* @since 4.1.2
*/
@@ -107,17 +112,20 @@ public class DateTime extends Date {
/**
* 给定日期的构造
- *
+ *
* @param date 日期
*/
public DateTime(Date date) {
- this(date.getTime(), TimeZone.getDefault());
+ this(
+ date.getTime(),//
+ (date instanceof DateTime) ? ((DateTime) date).timeZone : TimeZone.getDefault()
+ );
}
/**
* 给定日期的构造
- *
- * @param date 日期
+ *
+ * @param date 日期
* @param timeZone 时区
* @since 4.1.2
*/
@@ -127,28 +135,28 @@ public class DateTime extends Date {
/**
* 给定日期的构造
- *
+ *
* @param calendar {@link Calendar}
*/
public DateTime(Calendar calendar) {
- this(calendar.getTime(), (TimeZone) null);
+ this(calendar.getTime(), calendar.getTimeZone());
}
/**
* 给定日期毫秒数的构造
- *
+ *
* @param timeMillis 日期毫秒数
* @since 4.1.2
*/
public DateTime(long timeMillis) {
- this(timeMillis, (TimeZone) null);
+ this(timeMillis, TimeZone.getDefault());
}
/**
* 给定日期毫秒数的构造
- *
+ *
* @param timeMillis 日期毫秒数
- * @param timeZone 时区
+ * @param timeZone 时区
* @since 4.1.2
*/
public DateTime(long timeMillis, TimeZone timeZone) {
@@ -160,10 +168,10 @@ public class DateTime extends Date {
/**
* 构造
- *
- * @see DatePattern
+ *
* @param dateStr Date字符串
- * @param format 格式
+ * @param format 格式
+ * @see DatePattern
*/
public DateTime(String dateStr, String format) {
this(dateStr, new SimpleDateFormat(format));
@@ -171,10 +179,10 @@ public class DateTime extends Date {
/**
* 构造
- *
- * @see DatePattern
- * @param dateStr Date字符串
+ *
+ * @param dateStr Date字符串
* @param dateFormat 格式化器 {@link SimpleDateFormat}
+ * @see DatePattern
*/
public DateTime(String dateStr, DateFormat dateFormat) {
this(parse(dateStr, dateFormat), dateFormat.getTimeZone());
@@ -182,24 +190,25 @@ public class DateTime extends Date {
/**
* 构造
- *
- * @see DatePattern
- * @param dateStr Date字符串
+ *
+ * @param dateStr Date字符串
* @param dateParser 格式化器 {@link DateParser},可以使用 {@link FastDateFormat}
+ * @see DatePattern
*/
public DateTime(String dateStr, DateParser dateParser) {
this(parse(dateStr, dateParser), dateParser.getTimeZone());
}
-
+
// -------------------------------------------------------------------- Constructor end
// -------------------------------------------------------------------- offset start
+
/**
* 调整日期和时间
* 如果此对象为可变对象,返回自身,否则返回新对象,设置是否可变对象见{@link #setMutable(boolean)}
- *
+ *
* @param datePart 调整的部分 {@link DateField}
- * @param offset 偏移量,正数为向后偏移,负数为向前偏移
+ * @param offset 偏移量,正数为向后偏移,负数为向前偏移
* @return 如果此对象为可变对象,返回自身,否则返回新对象
*/
public DateTime offset(DateField datePart, int offset) {
@@ -213,9 +222,9 @@ public class DateTime extends Date {
/**
* 调整日期和时间
* 返回调整后的新{@link DateTime},不影响原对象
- *
+ *
* @param datePart 调整的部分 {@link DateField}
- * @param offset 偏移量,正数为向后偏移,负数为向前偏移
+ * @param offset 偏移量,正数为向后偏移,负数为向前偏移
* @return 如果此对象为可变对象,返回自身,否则返回新对象
* @since 3.0.9
*/
@@ -229,10 +238,11 @@ public class DateTime extends Date {
// -------------------------------------------------------------------- offset end
// -------------------------------------------------------------------- Part of Date start
+
/**
* 获得日期的某个部分
* 例如获得年的部分,则使用 getField(DatePart.YEAR)
- *
+ *
* @param field 表示日期的哪个部分的枚举 {@link DateField}
* @return 某个部分的值
*/
@@ -243,7 +253,7 @@ public class DateTime extends Date {
/**
* 获得日期的某个部分
* 例如获得年的部分,则使用 getField(Calendar.YEAR)
- *
+ *
* @param field 表示日期的哪个部分的int值 {@link Calendar}
* @return 某个部分的值
*/
@@ -254,7 +264,7 @@ public class DateTime extends Date {
/**
* 设置日期的某个部分
* 如果此对象为可变对象,返回自身,否则返回新对象,设置是否可变对象见{@link #setMutable(boolean)}
- *
+ *
* @param field 表示日期的哪个部分的枚举 {@link DateField}
* @param value 值
* @return {@link DateTime}
@@ -266,7 +276,7 @@ public class DateTime extends Date {
/**
* 设置日期的某个部分
* 如果此对象为可变对象,返回自身,否则返回新对象,设置是否可变对象见{@link #setMutable(boolean)}
- *
+ *
* @param field 表示日期的哪个部分的int值 {@link Calendar}
* @param value 值
* @return {@link DateTime}
@@ -293,7 +303,7 @@ public class DateTime extends Date {
/**
* 获得年的部分
- *
+ *
* @return 年的部分
*/
public int year() {
@@ -306,7 +316,7 @@ public class DateTime extends Date {
* 2:第二季度
* 3:第三季度
* 4:第四季度
- *
+ *
* @return 第几个季度
* @deprecated 请使用{@link Quarter}代替
*/
@@ -317,7 +327,7 @@ public class DateTime extends Date {
/**
* 获得当前日期所属季度
- *
+ *
* @return 第几个季度 {@link Season}
* @deprecated 请使用{@link #quarterEnum}代替
*/
@@ -328,7 +338,7 @@ public class DateTime extends Date {
/**
* 获得当前日期所属季度,从1开始计数
- *
+ *
* @return 第几个季度 {@link Quarter}
*/
public int quarter() {
@@ -337,7 +347,7 @@ public class DateTime extends Date {
/**
* 获得当前日期所属季度
- *
+ *
* @return 第几个季度 {@link Quarter}
*/
public Quarter quarterEnum() {
@@ -346,7 +356,7 @@ public class DateTime extends Date {
/**
* 获得月份,从0开始计数
- *
+ *
* @return 月份
*/
public int month() {
@@ -356,7 +366,7 @@ public class DateTime extends Date {
/**
* 获得月份,从1开始计数
* 由于{@link Calendar} 中的月份按照0开始计数,导致某些需求容易误解,因此如果想用1表示一月,2表示二月则调用此方法
- *
+ *
* @return 月份
*/
public int monthStartFromOne() {
@@ -365,7 +375,7 @@ public class DateTime extends Date {
/**
* 获得月份
- *
+ *
* @return {@link Month}
*/
public Month monthEnum() {
@@ -378,7 +388,7 @@ public class DateTime extends Date {
* 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
* 如果一周的第一天为周一,那这天是第一周(返回1)
* 跨年的那个星期得到的结果总是1
- *
+ *
* @return 周
* @see #setFirstDayOfWeek(Week)
*/
@@ -391,7 +401,7 @@ public class DateTime extends Date {
* 此方法返回值与一周的第一天有关,比如:
* 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
* 如果一周的第一天为周一,那这天是第一周(返回1)
- *
+ *
* @return 周
* @see #setFirstDayOfWeek(Week)
*/
@@ -401,7 +411,7 @@ public class DateTime extends Date {
/**
* 获得指定日期是这个日期所在月份的第几天
- *
+ *
* @return 天
*/
public int dayOfMonth() {
@@ -410,7 +420,7 @@ public class DateTime extends Date {
/**
* 获得指定日期是星期几,1表示周日,2表示周一
- *
+ *
* @return 星期几
*/
public int dayOfWeek() {
@@ -419,7 +429,7 @@ public class DateTime extends Date {
/**
* 获得天所在的周是这个月的第几周
- *
+ *
* @return 天
*/
public int dayOfWeekInMonth() {
@@ -428,7 +438,7 @@ public class DateTime extends Date {
/**
* 获得指定日期是星期几
- *
+ *
* @return {@link Week}
*/
public Week dayOfWeekEnum() {
@@ -437,7 +447,7 @@ public class DateTime extends Date {
/**
* 获得指定日期的小时数部分
- *
+ *
* @param is24HourClock 是否24小时制
* @return 小时数
*/
@@ -448,7 +458,7 @@ public class DateTime extends Date {
/**
* 获得指定日期的分钟数部分
* 例如:10:04:15.250 =》 4
- *
+ *
* @return 分钟数
*/
public int minute() {
@@ -457,7 +467,7 @@ public class DateTime extends Date {
/**
* 获得指定日期的秒数部分
- *
+ *
* @return 秒数
*/
public int second() {
@@ -466,7 +476,7 @@ public class DateTime extends Date {
/**
* 获得指定日期的毫秒数部分
- *
+ *
* @return 毫秒数
*/
public int millsecond() {
@@ -475,7 +485,7 @@ public class DateTime extends Date {
/**
* 是否为上午
- *
+ *
* @return 是否为上午
*/
public boolean isAM() {
@@ -484,7 +494,7 @@ public class DateTime extends Date {
/**
* 是否为下午
- *
+ *
* @return 是否为下午
*/
public boolean isPM() {
@@ -493,7 +503,7 @@ public class DateTime extends Date {
/**
* 是否为周末,周末指周六或者周日
- *
+ *
* @return 是否为周末,周末指周六或者周日
* @since 4.1.14
*/
@@ -505,9 +515,9 @@ public class DateTime extends Date {
/**
* 是否闰年
- *
- * @see DateUtil#isLeapYear(int)
+ *
* @return 是否闰年
+ * @see DateUtil#isLeapYear(int)
*/
public boolean isLeapYear() {
return DateUtil.isLeapYear(year());
@@ -515,7 +525,7 @@ public class DateTime extends Date {
/**
* 转换为Calendar, 默认 {@link Locale}
- *
+ *
* @return {@link Calendar}
*/
public Calendar toCalendar() {
@@ -524,7 +534,7 @@ public class DateTime extends Date {
/**
* 转换为Calendar
- *
+ *
* @param locale 地域 {@link Locale}
* @return {@link Calendar}
*/
@@ -534,7 +544,7 @@ public class DateTime extends Date {
/**
* 转换为Calendar
- *
+ *
* @param zone 时区 {@link TimeZone}
* @return {@link Calendar}
*/
@@ -544,8 +554,8 @@ public class DateTime extends Date {
/**
* 转换为Calendar
- *
- * @param zone 时区 {@link TimeZone}
+ *
+ * @param zone 时区 {@link TimeZone}
* @param locale 地域 {@link Locale}
* @return {@link Calendar}
*/
@@ -562,7 +572,7 @@ public class DateTime extends Date {
/**
* 转换为 {@link Date}
* 考虑到很多框架(例如Hibernate)的兼容性,提供此方法返回JDK原生的Date对象
- *
+ *
* @return {@link Date}
* @since 3.2.2
*/
@@ -572,7 +582,7 @@ public class DateTime extends Date {
/**
* 转为{@link Timestamp}
- *
+ *
* @return {@link Timestamp}
*/
public Timestamp toTimestamp() {
@@ -581,7 +591,7 @@ public class DateTime extends Date {
/**
* 转为 {@link java.sql.Date}
- *
+ *
* @return {@link java.sql.Date}
*/
public java.sql.Date toSqlDate() {
@@ -590,7 +600,7 @@ public class DateTime extends Date {
/**
* 计算相差时长
- *
+ *
* @param date 对比的日期
* @return {@link DateBetween}
*/
@@ -600,7 +610,7 @@ public class DateTime extends Date {
/**
* 计算相差时长
- *
+ *
* @param date 对比的日期
* @param unit 单位 {@link DateUnit}
* @return 相差时长
@@ -611,9 +621,9 @@ public class DateTime extends Date {
/**
* 计算相差时长
- *
- * @param date 对比的日期
- * @param unit 单位 {@link DateUnit}
+ *
+ * @param date 对比的日期
+ * @param unit 单位 {@link DateUnit}
* @param formatLevel 格式化级别
* @return 相差时长
*/
@@ -624,9 +634,9 @@ public class DateTime extends Date {
/**
* 当前日期是否在日期指定范围内
* 起始日期和结束日期可以互换
- *
+ *
* @param beginDate 起始日期
- * @param endDate 结束日期
+ * @param endDate 结束日期
* @return 是否在范围内
* @since 3.0.8
*/
@@ -640,7 +650,7 @@ public class DateTime extends Date {
/**
* 是否在给定日期之前
- *
+ *
* @param date 日期
* @return 是否在给定日期之前
* @since 4.1.3
@@ -654,7 +664,7 @@ public class DateTime extends Date {
/**
* 是否在给定日期之前或与给定日期相等
- *
+ *
* @param date 日期
* @return 是否在给定日期之前或与给定日期相等
* @since 3.0.9
@@ -668,7 +678,7 @@ public class DateTime extends Date {
/**
* 是否在给定日期之后
- *
+ *
* @param date 日期
* @return 是否在给定日期之后
* @since 4.1.3
@@ -682,7 +692,7 @@ public class DateTime extends Date {
/**
* 是否在给定日期之后或与给定日期相等
- *
+ *
* @param date 日期
* @return 是否在给定日期之后或与给定日期相等
* @since 3.0.9
@@ -703,7 +713,7 @@ public class DateTime extends Date {
*
* export TZ=Asia/Shanghai *- * - * @author Looly * + * @author Looly */ public class DateUtilTest { @@ -289,13 +281,13 @@ public class DateUtilTest { } @Test - public void parseTest4() throws ParseException { + public void parseTest4() { String ymd = DateUtil.parse("2019-3-21 12:20:15", "yyyy-MM-dd").toString(DatePattern.PURE_DATE_PATTERN); Assert.assertEquals("20190321", ymd); } @Test - public void parseTest5() throws ParseException { + public void parseTest5() { // 测试时间解析 String time = DateUtil.parse("22:12:12").toString(DatePattern.NORM_TIME_FORMAT); Assert.assertEquals("22:12:12", time); @@ -321,21 +313,32 @@ public class DateUtilTest { } @Test - public void parseTest6() throws ParseException { + public void parseTest6() { String str = "Tue Jun 4 16:25:15 +0800 2019"; DateTime dateTime = DateUtil.parse(str); Assert.assertEquals("2019-06-04 16:25:15", dateTime.toString()); } - + @Test - public void parseTest7() throws ParseException { + public void parseTest7() { String str = "2019-06-01T19:45:43.000 +0800"; DateTime dateTime = DateUtil.parse(str, "yyyy-MM-dd'T'HH:mm:ss.SSS Z"); Assert.assertEquals("2019-06-01 19:45:43", dateTime.toString()); } @Test - public void parseDateTest() throws ParseException { + public void parseAndOffsetTest() { + // 检查UTC时间偏移是否准确 + String str = "2019-09-17T13:26:17.948Z"; + DateTime dateTime = DateUtil.parse(str); + Assert.assertEquals("2019-09-17 13:26:17", dateTime.toString()); + + DateTime offset = DateUtil.offsetHour(dateTime, 8); + Assert.assertEquals("2019-09-17 21:26:17", offset.toString()); + } + + @Test + public void parseDateTest() { String dateStr = "2018-4-10"; Date date = DateUtil.parseDate(dateStr); String format = DateUtil.format(date, DatePattern.NORM_DATE_PATTERN); @@ -411,7 +414,7 @@ public class DateUtilTest { } @Test - public void parseUTCTest() throws ParseException { + public void parseUTCTest() { String dateStr1 = "2018-09-13T05:34:31Z"; DateTime dt = DateUtil.parseUTC(dateStr1); @@ -426,44 +429,44 @@ public class DateUtilTest { // 使用当前(上海)时区 dateStr = dt.toString(TimeZone.getTimeZone("GMT+8:00")); Assert.assertEquals("2018-09-13 13:34:31", dateStr); - + dateStr1 = "2018-09-13T13:34:32+0800"; dt = DateUtil.parseUTC(dateStr1); dateStr = dt.toString(TimeZone.getTimeZone("GMT+8:00")); Assert.assertEquals("2018-09-13 13:34:32", dateStr); - + dateStr1 = "2018-09-13T13:34:33+08:00"; dt = DateUtil.parseUTC(dateStr1); dateStr = dt.toString(TimeZone.getTimeZone("GMT+8:00")); Assert.assertEquals("2018-09-13 13:34:33", dateStr); - + dateStr1 = "2018-09-13T13:34:34+0800"; dt = DateUtil.parse(dateStr1); dateStr = dt.toString(TimeZone.getTimeZone("GMT+8:00")); Assert.assertEquals("2018-09-13 13:34:34", dateStr); - + dateStr1 = "2018-09-13T13:34:35+08:00"; dt = DateUtil.parse(dateStr1); dateStr = dt.toString(TimeZone.getTimeZone("GMT+8:00")); Assert.assertEquals("2018-09-13 13:34:35", dateStr); - + dateStr1 = "2018-09-13T13:34:36.999+0800"; dt = DateUtil.parseUTC(dateStr1); final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatePattern.NORM_DATETIME_MS_PATTERN); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); dateStr = dt.toString(simpleDateFormat); Assert.assertEquals("2018-09-13 13:34:36.999", dateStr); - + dateStr1 = "2018-09-13T13:34:37.999+08:00"; dt = DateUtil.parseUTC(dateStr1); dateStr = dt.toString(simpleDateFormat); Assert.assertEquals("2018-09-13 13:34:37.999", dateStr); - + dateStr1 = "2018-09-13T13:34:38.999+0800"; dt = DateUtil.parse(dateStr1); dateStr = dt.toString(simpleDateFormat); Assert.assertEquals("2018-09-13 13:34:38.999", dateStr); - + dateStr1 = "2018-09-13T13:34:39.999+08:00"; dt = DateUtil.parse(dateStr1); dateStr = dt.toString(simpleDateFormat); @@ -471,7 +474,7 @@ public class DateUtilTest { } @Test - public void parseJDkTest() throws ParseException { + public void parseJDkTest() { String dateStr = "Thu May 16 17:57:18 GMT+08:00 2019"; DateTime time = DateUtil.parse(dateStr); Assert.assertEquals("2019-05-16 17:57:18", time.toString()); @@ -484,7 +487,7 @@ public class DateUtilTest { DateTime endOfYear = DateUtil.endOfYear(date); Assert.assertEquals("2019-12-31 23:59:59", endOfYear.toString()); } - + @Test public void endOfWeekTest() { // 周日 @@ -521,7 +524,7 @@ public class DateUtilTest { try { range.next(); Assert.fail("已超过边界,下一个元素不应该存在!"); - } catch (NoSuchElementException e) { + } catch (NoSuchElementException ignored) { } // 测试多步进的情况 @@ -535,7 +538,7 @@ public class DateUtilTest { try { range.next(); Assert.fail("不包含结束时间情况下,下一个元素不应该存在!"); - } catch (NoSuchElementException e) { + } catch (NoSuchElementException ignored) { } } diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java index 6abd5453a..35aabbf1f 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java @@ -41,7 +41,7 @@ import cn.hutool.json.JSON; /** * http请求类
* 相关issue见:https://gitee.com/loolly/hutool/issues/IMD1X
- *
+ *
* @param urlHandler {@link URLStreamHandler}
* @since 4.1.9
*/
@@ -268,7 +299,7 @@ public class HttpRequest extends HttpBase
* 一般执行完execute之后会把响应内容全部读出来放在一个 byte数组里,如果你响应的内容太多内存就爆了,此法是发送完请求不直接读响应内容,等有需要的时候读。
-
- *
+ *
* @return 异步对象,使用get方法获取HttpResponse对象
*/
public HttpResponse executeAsync() {
@@ -899,7 +931,7 @@ public class HttpRequest extends HttpBase
* 在{@link #execute()} 执行前此对象为null
- *
+ *
* @return {@link HttpConnection}
* @since 4.2.2
*/
@@ -301,7 +332,7 @@ public class HttpRequest extends HttpBase
* 自定义Cookie后会覆盖Hutool的默认Cookie行为
- *
+ *
* @param cookies Cookie值数组,如果为{@code null}则设置无效,使用默认Cookie行为
* @return this
* @since 3.1.1
@@ -389,7 +421,7 @@ public class HttpRequest extends HttpBase
* 自定义Cookie后会覆盖Hutool的默认Cookie行为
- *
+ *
* @param cookie Cookie值,如果为{@code null}则设置无效,使用默认Cookie行为
* @return this
* @since 3.0.7
@@ -403,7 +435,7 @@ public class HttpRequest extends HttpBase
* 如果想重新启用Cookie,请调用:{@link #cookie(String)}方法自定义Cookie。
* 如果想启动默认的Cookie行为(自动回填服务器传回的Cookie),则调用{@link #enableDefaultCookie()}
- *
+ *
* @return this
* @since 3.0.7
*/
@@ -413,7 +445,7 @@ public class HttpRequest extends HttpBase
- *
- * @param name 名
+ *
+ * @param name 名
* @param value 值
* @return this
*/
@@ -469,12 +502,11 @@ public class HttpRequest extends HttpBase
* 一旦有文件加入,表单变为multipart/form-data
- *
- * @param name 名
+ *
+ * @param name 名
* @param files 需要上传的文件
* @return this
*/
@@ -521,7 +552,7 @@ public class HttpRequest extends HttpBase
* 一旦有文件加入,表单变为multipart/form-data
- *
+ *
* @param name 名
* @param file 需要上传的文件
* @return this
@@ -533,9 +564,9 @@ public class HttpRequest extends HttpBase
* 一旦有文件加入,表单变为multipart/form-data
- *
- * @param name 名
- * @param file 需要上传的文件
+ *
+ * @param name 名
+ * @param file 需要上传的文件
* @param fileName 文件名,为空使用文件默认的文件名
* @return this
*/
@@ -549,10 +580,10 @@ public class HttpRequest extends HttpBase
* 一旦有文件加入,表单变为multipart/form-data
- *
- * @param name 名
+ *
+ * @param name 名
* @param fileBytes 需要上传的文件
- * @param fileName 文件名
+ * @param fileName 文件名
* @return this
* @since 4.1.0
*/
@@ -566,8 +597,8 @@ public class HttpRequest extends HttpBase
* 一旦有文件加入,表单变为multipart/form-data
- *
- * @param name 名
+ *
+ * @param name 名
* @param resource 数据源,文件可以使用{@link FileResource}包装使用
* @return this
* @since 4.0.9
@@ -589,7 +620,7 @@ public class HttpRequest extends HttpBase
* 请求体body参数支持两种类型:
- *
+ *
*
* 1. 标准参数,例如 a=1&b=2 这种格式
* 2. Rest模式,此时body需要传入一个JSON或者XML字符串,Hutool会自动绑定其对应的Content-Type
*
- *
+ *
* @param body 请求体
* @return this
*/
@@ -627,13 +659,13 @@ public class HttpRequest extends HttpBase
* 请求体body参数支持两种类型:
- *
+ *
*
* 1. 标准参数,例如 a=1&b=2 这种格式
* 2. Rest模式,此时body需要传入一个JSON或者XML字符串,Hutool会自动绑定其对应的Content-Type
*
- *
- * @param body 请求体
+ *
+ * @param body 请求体
* @param contentType 请求体类型,{@code null}表示自动判断类型
* @return this
*/
@@ -668,7 +700,7 @@ public class HttpRequest extends HttpBase
* 设置默认的Content-Type为 application/json 需在此方法调用前使用charset方法设置编码,否则使用默认编码UTF-8
- *
+ *
* @param json JSON请求体
* @return this
* @deprecated 未来可能去除此方法,使用{@link #body(String)} 传入JSON字符串即可
@@ -681,13 +713,14 @@ public class HttpRequest extends HttpBase
* 需在此方法调用前使用charset方法设置编码,否则使用默认编码UTF-8
- *
+ *
* @param bodyBytes 主体
* @return this
*/
public HttpRequest body(byte[] bodyBytes) {
- Assert.notNull(bodyBytes, "Body must be not null !");
- this.bodyBytes = bodyBytes;
+ if (null != bodyBytes) {
+ this.bodyBytes = bodyBytes;
+ }
return this;
}
// ---------------------------------------------------------------- Body end
@@ -695,12 +728,12 @@ public class HttpRequest extends HttpBase
* 超时包括:
- *
+ *
*
* 1. 连接超时
* 2. 读取响应超时
*
- *
+ *
* @param milliseconds 超时毫秒数
* @return this
* @see #setConnectionTimeout(int)
@@ -714,7 +747,7 @@ public class HttpRequest extends HttpBase
* 此方法效果与{@link #setMaxRedirectCount(int)} 一致
- *
+ *
* @param isFollowRedirects 是否打开重定向
* @return this
*/
@@ -772,7 +805,7 @@ public class HttpRequest extends HttpBase
* 如果次数小于1则表示不重定向,大于等于1表示打开重定向
- *
+ *
* @param maxRedirectCount 最大重定向次数
* @return this
* @since 3.3.0
@@ -789,7 +822,7 @@ public class HttpRequest extends HttpBase
* 只针对HTTPS请求,如果不设置,不做验证,所有域名被信任
- *
+ *
* @param hostnameVerifier HostnameVerifier
* @return this
*/
@@ -801,7 +834,7 @@ public class HttpRequest extends HttpBase
* 只针对HTTPS请求,如果不设置,使用默认的SSLSocketFactory
* 默认SSLSocketFactory为:SSLSocketFactoryBuilder.create().build();
- *
+ *
* @param ssf SSLScketFactory
* @return this
*/
@@ -825,17 +858,17 @@ public class HttpRequest extends HttpBase
- *
+ *
*
* 1. TLSv1.2
* 2. TLSv1.1
* 3. SSLv3
* ...
*
- *
- * @see SSLSocketFactoryBuilder
+ *
* @param protocol 协议
* @return this
+ * @see SSLSocketFactoryBuilder
*/
public HttpRequest setSSLProtocol(String protocol) {
if (null == this.ssf) {
@@ -850,7 +883,7 @@ public class HttpRequest extends HttpBase
* HttpUrlConnection默认是将所有数据读到本地缓存,然后再发送给服务器,这样上传大文件时就会导致内存溢出。
- *
+ *
* @param blockSize 块大小(bytes数),0或小于0表示不设置Chuncked模式
* @return this
* @since 4.6.5
@@ -875,7 +908,7 @@ public class HttpRequest extends HttpBase
* 异步请求后获取的{@link HttpResponse} 为异步模式,执行完此方法后发送请求到服务器,但是并不立即读取响应内容。
* 此时保持Http连接不关闭,直调用获取内容方法为止。
- *
+ *
* null
- *
+ *
* @return {@link HttpResponse},无转发返回 null
*/
private HttpResponse sendRedirectIfPosible() {
@@ -1026,7 +1059,7 @@ public class HttpRequest extends HttpBase
* 发送数据后自动关闭输出流
- *
+ *
* @throws IOException
*/
private void sendFormUrlEncoded() throws IOException {
@@ -1071,13 +1104,13 @@ public class HttpRequest extends HttpBase
* 发送数据后自动关闭输出流
- *
+ *
* @throws IOException
*/
private void sendMultipart() throws IOException {
setMultipart();// 设置表单类型为Multipart
- try(OutputStream out = this.httpConnection.getOutputStream()) {
+ try (OutputStream out = this.httpConnection.getOutputStream()) {
writeFileForm(out);
writeForm(out);
formEnd(out);
@@ -1087,9 +1120,10 @@ public class HttpRequest extends HttpBase
* HEAD、CONNECT、OPTIONS、TRACE方法将不读取响应体
- *
+ *
* @return 是否需要忽略响应body部分
* @since 3.1.2
*/