diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bad90665ac4ea5e32e7d3cc51fa8d1f932170a8..781b0cb02fdc8ec914ba8b7683466442397b03a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 发行版本 ### v2.1.1 - 2023-04-08 +- :sparkles: mica-mqtt-server http-api 不再强制依赖 `fastjson` 还支持 `Jackson`、`Fastjson2`、`Gson`、`hutool-json` 和自定义。 - :sparkles: mica-mqtt-codec 删除 `net.dreamlu.iot.mqtt.codec.ByteBufferUtil`,2.1.0 漏删。 - :sparkles: mica-mqtt-codec 兼容 qos大于0,messageId == 0,做 qos 降级处理,`@那一刹的容颜` 反馈,详见 gitee #I6PFIH - :sparkles: mica-mqtt-client 优化链接时的遗嘱消息构建,默认为 qos0。 diff --git a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java index cf2cc71f782950791b1744273649b75a50940aa0..a7732f03231837614060b5e2ae631bd9d6c356a9 100644 --- a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java +++ b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java @@ -50,6 +50,8 @@ import org.tio.server.intf.TioServerHandler; import org.tio.server.intf.TioServerListener; import org.tio.utils.Threads; import org.tio.utils.hutool.StrUtil; +import org.tio.utils.json.JsonAdapter; +import org.tio.utils.json.JsonUtil; import org.tio.utils.timer.DefaultTimerTaskService; import org.tio.utils.timer.TimerTaskService; @@ -200,6 +202,10 @@ public class MqttServerCreator { * taskService */ private TimerTaskService taskService; + /** + * json 处理器 + */ + private JsonAdapter jsonAdapter; public String getName() { return name; @@ -527,6 +533,15 @@ public class MqttServerCreator { return this; } + public JsonAdapter getJsonAdapter() { + return jsonAdapter; + } + + public MqttServerCreator jsonAdapter(JsonAdapter jsonAdapter) { + this.jsonAdapter = JsonUtil.getJsonAdapter(jsonAdapter); + return this; + } + public MqttServer build() { // 默认的节点名称,用于集群 if (StrUtil.isBlank(this.nodeName)) { diff --git a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/MqttHttpApi.java b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/MqttHttpApi.java index c38655c2e9037fb4f886b454469d7be9ebfc4609..978702dd0fd579ad1af7734e1890e0e83003f716 100644 --- a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/MqttHttpApi.java +++ b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/MqttHttpApi.java @@ -16,7 +16,6 @@ package net.dreamlu.iot.mqtt.core.server.http.api; -import com.alibaba.fastjson.JSON; import net.dreamlu.iot.mqtt.core.server.MqttServerCreator; import net.dreamlu.iot.mqtt.core.server.dispatcher.IMqttMessageDispatcher; import net.dreamlu.iot.mqtt.core.server.enums.MessageType; @@ -31,13 +30,14 @@ import net.dreamlu.iot.mqtt.core.server.model.Subscribe; import net.dreamlu.iot.mqtt.core.server.session.IMqttSessionManager; import net.dreamlu.iot.mqtt.core.util.PayloadEncode; import net.dreamlu.iot.mqtt.core.util.TopicUtil; +import org.tio.http.common.HttpConst; import org.tio.http.common.HttpRequest; import org.tio.http.common.HttpResponse; import org.tio.http.common.Method; import org.tio.utils.hutool.StrUtil; +import org.tio.utils.json.JsonUtil; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.function.Function; @@ -77,7 +77,7 @@ public class MqttHttpApi { */ public HttpResponse publish(HttpRequest request) { PublishForm form = readForm(request, (requestBody) -> - JSON.parseObject(requestBody, PublishForm.class) + JsonUtil.readValue(requestBody, PublishForm.class) ); if (form == null) { return Result.fail(request, ResultCode.E101); @@ -100,10 +100,9 @@ public class MqttHttpApi { * @return HttpResponse */ public HttpResponse publishBatch(HttpRequest request) { - List formList = readForm(request, (requestBody) -> { - String jsonBody = new String(requestBody, StandardCharsets.UTF_8); - return JSON.parseArray(jsonBody, PublishForm.class); - }); + List formList = readForm(request, (requestBody) -> + JsonUtil.readList(requestBody, PublishForm.class) + ); if (formList == null || formList.isEmpty()) { return Result.fail(request, ResultCode.E101); } @@ -147,7 +146,7 @@ public class MqttHttpApi { */ public HttpResponse subscribe(HttpRequest request) { SubscribeForm form = readForm(request, (requestBody) -> - JSON.parseObject(requestBody, SubscribeForm.class) + JsonUtil.readValue(requestBody, SubscribeForm.class) ); if (form == null) { return Result.fail(request, ResultCode.E101); @@ -175,10 +174,9 @@ public class MqttHttpApi { * @return HttpResponse */ public HttpResponse subscribeBatch(HttpRequest request) { - List formList = readForm(request, (requestBody) -> { - String jsonBody = new String(requestBody, StandardCharsets.UTF_8); - return JSON.parseArray(jsonBody, SubscribeForm.class); - }); + List formList = readForm(request, (requestBody) -> + JsonUtil.readList(requestBody, SubscribeForm.class) + ); if (formList == null || formList.isEmpty()) { return Result.fail(request, ResultCode.E101); } @@ -212,7 +210,7 @@ public class MqttHttpApi { */ public HttpResponse unsubscribe(HttpRequest request) { BaseForm form = readForm(request, (requestBody) -> - JSON.parseObject(requestBody, BaseForm.class) + JsonUtil.readValue(requestBody, BaseForm.class) ); if (form == null) { return Result.fail(request, ResultCode.E101); @@ -236,10 +234,9 @@ public class MqttHttpApi { * @return HttpResponse */ public HttpResponse unsubscribeBatch(HttpRequest request) { - List formList = readForm(request, (requestBody) -> { - String jsonBody = new String(requestBody, StandardCharsets.UTF_8); - return JSON.parseArray(jsonBody, BaseForm.class); - }); + List formList = readForm(request, (requestBody) -> + JsonUtil.readList(requestBody, BaseForm.class) + ); if (formList == null || formList.isEmpty()) { return Result.fail(request, ResultCode.E101); } @@ -317,12 +314,12 @@ public class MqttHttpApi { * @param 泛型 * @return 表单 */ - private static T readForm(HttpRequest request, Function function) { + private static T readForm(HttpRequest request, Function function) { byte[] requestBody = request.getBody(); if (requestBody == null) { return null; } - return function.apply(requestBody); + return function.apply(new String(requestBody, HttpConst.CHARSET)); } /** diff --git a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/result/Result.java b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/result/Result.java index 12086ba599eb331bd3a773d8dafc96ab9d66740e..5fd9586326d694efcf21b5b5bb13a4ad0d3be489 100644 --- a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/result/Result.java +++ b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/api/result/Result.java @@ -16,15 +16,12 @@ package net.dreamlu.iot.mqtt.core.server.http.api.result; -import com.alibaba.fastjson.JSONObject; import net.dreamlu.iot.mqtt.core.server.http.api.code.ResultCode; -import org.tio.http.common.HeaderName; -import org.tio.http.common.HeaderValue; -import org.tio.http.common.HttpRequest; -import org.tio.http.common.HttpResponse; +import org.tio.http.common.*; +import org.tio.utils.json.JsonUtil; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; /** * api Result @@ -32,7 +29,6 @@ import java.nio.charset.StandardCharsets; * @author L.cm */ public final class Result { - private static final Charset UTF_8 = StandardCharsets.UTF_8; /** * 响应成功 @@ -51,7 +47,7 @@ public final class Result { */ public static HttpResponse ok(HttpResponse response) { ResultCode resultCode = ResultCode.SUCCESS; - JSONObject json = new JSONObject(); + Map json = new HashMap<>(2); json.put("code", resultCode.getResultCode()); return result(response, resultCode, json); } @@ -86,7 +82,7 @@ public final class Result { */ public static HttpResponse ok(HttpResponse response, Object data) { ResultCode resultCode = ResultCode.SUCCESS; - JSONObject json = new JSONObject(); + Map json = new HashMap<>(4); json.put("code", resultCode.getResultCode()); json.put("data", data); return result(response, resultCode, json); @@ -121,16 +117,16 @@ public final class Result { * @return HttpResponse */ public static HttpResponse fail(HttpResponse response, ResultCode resultCode) { - JSONObject json = new JSONObject(); + Map json = new HashMap<>(2); json.put("code", resultCode.getResultCode()); return result(response, resultCode, json); } - private static HttpResponse result(HttpResponse response, ResultCode resultCode, JSONObject json) { + private static HttpResponse result(HttpResponse response, ResultCode resultCode, Object value) { response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); response.setStatus(resultCode.getStatusCode()); - response.setBody(json.toJSONString().getBytes(UTF_8)); - response.setCharset(UTF_8); + response.setBody(JsonUtil.toJsonString(value).getBytes(HttpConst.CHARSET)); + response.setCharset(HttpConst.CHARSET); return response; } diff --git a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/core/MqttWebServer.java b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/core/MqttWebServer.java index d2896323bed15810de9941fc699e0a70f5f033ad..79195a9f1159461f6fb3e1811d77da1e702483ae 100644 --- a/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/core/MqttWebServer.java +++ b/mica-mqtt-server/src/main/java/net/dreamlu/iot/mqtt/core/server/http/core/MqttWebServer.java @@ -206,6 +206,7 @@ import org.tio.http.common.handler.HttpRequestHandler; import org.tio.server.TioServer; import org.tio.server.TioServerConfig; import org.tio.server.intf.TioServerListener; +import org.tio.utils.json.JsonUtil; import org.tio.utils.thread.pool.SynThreadPoolExecutor; import org.tio.websocket.server.handler.IWsMsgHandler; @@ -284,10 +285,12 @@ public class MqttWebServer { public static MqttWebServer config(MqttServerCreator serverCreator, TioServerConfig mqttServerConfig) { // 1. 判断是否开启 http if (serverCreator.isHttpEnable()) { - // 1.1 http 路由配置 + // 1.1 http-api 用到 json + serverCreator.jsonAdapter(JsonUtil.getJsonAdapter(serverCreator.getJsonAdapter())); + // 1.2 http 路由配置 MqttHttpApi httpApi = new MqttHttpApi(serverCreator); httpApi.register(); - // 1.2 认证配置 + // 1.3 认证配置 String username = serverCreator.getHttpBasicUsername(); String password = serverCreator.getHttpBasicPassword(); if (Objects.nonNull(username) && Objects.nonNull(password)) { diff --git a/pom.xml b/pom.xml index 2f740145288ecfcb403b8abee8cf08bdb663c39d..b845cb96c761d60d792700ef2e0145bd6c48f265 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ UTF-8 1.2.2 - 0.0.8 + 0.0.9-SNAPSHOT 2.7.9 2.3.2 2.7.9 diff --git a/starter/jfinal-mica-mqtt-server/pom.xml b/starter/jfinal-mica-mqtt-server/pom.xml index 5a03734ec88f29e983d34f75df8560d3411eb79e..948df6357956ca86a30995785f53568680fc61b4 100644 --- a/starter/jfinal-mica-mqtt-server/pom.xml +++ b/starter/jfinal-mica-mqtt-server/pom.xml @@ -22,10 +22,6 @@ net.dreamlu mica-net-http - - com.alibaba - fastjson - com.jfinal jfinal diff --git a/starter/mica-mqtt-server-spring-boot-starter/pom.xml b/starter/mica-mqtt-server-spring-boot-starter/pom.xml index 400e65f4b85aca62544ddbd6dc1e6be3008d9cf0..1039d4d7df23677b5288413136010937a99afca7 100644 --- a/starter/mica-mqtt-server-spring-boot-starter/pom.xml +++ b/starter/mica-mqtt-server-spring-boot-starter/pom.xml @@ -22,10 +22,6 @@ net.dreamlu mica-net-http - - com.alibaba - fastjson - org.springframework.boot spring-boot-autoconfigure