Ver Fonte

修改为json支持了

skyfffire há 2 meses atrás
pai
commit
1ede9b1f44

+ 31 - 34
src/main/java/common/interceptor/empty/EmptyInterceptor.java

@@ -1,15 +1,11 @@
 package common.interceptor.empty;
 
-// 不需要 FastJson 或 JSONObject 了,因为不处理 JSON 请求体
-// import com.alibaba.fastjson.JSONObject;
-
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.aop.Interceptor;
 import com.jfinal.aop.Invocation;
 import com.jfinal.core.Controller;
 import com.jfinal.kit.StrKit;
-
-// 不需要 MyController 了,因为不处理 JSON 请求了
-// import common.utils.http.MyController;
+import common.utils.http.MyController;
 import common.utils.http.MyRet;
 
 public class EmptyInterceptor implements Interceptor {
@@ -17,47 +13,48 @@ public class EmptyInterceptor implements Interceptor {
     public void intercept(Invocation inv) {
         EmptyInterface annotation = inv.getMethod().getAnnotation(EmptyInterface.class);
 
-        // 如果没有注解或者 keyArray 为空,则直接放行
-        if (annotation == null || annotation.keyArray().length == 0) {
+        if (annotation == null) {
             inv.invoke();
-            return;
+        } else {
+            String[] keyArray = annotation.keyArray();
+            Controller controller = inv.getController();
+            JSONObject paramsModel = MyController.getJsonModelByRequestAndType(controller.getRequest(), JSONObject.class);
+
+            if (isNotEmpty(paramsModel, keyArray)) {
+                inv.invoke();
+            } else {
+                String errorMsgBuilder = "参数必须包含: " +
+                        EmptyInterceptor.formatParams(keyArray) +
+                        ", 返回值的 'data' 是你发过来的参数.";
+
+                controller.renderJson(MyRet.fail(errorMsgBuilder).setData(paramsModel));
+            }
         }
+    }
 
-        String[] keyArray = annotation.keyArray();
-        Controller controller = inv.getController();
-
-        boolean allKeysPresentAndNotEmpty = true; // 默认所有参数都存在且不为空
-
+    private boolean isNotEmpty(JSONObject paramsModel, String[] keyArray) {
         for (String key : keyArray) {
-            // 对所有的请求类型,都通过 getPara() 获取参数
-            // JFinal 的 getPara() 会自动从 URL QueryString、POST 请求体 (form-urlencoded) 中获取参数
-            String paramValue = controller.getPara(key);
-
-            if (StrKit.isBlank(paramValue)) {
-                allKeysPresentAndNotEmpty = false;
-                break; // 发现一个空参数就停止检查
+            if (StrKit.isBlank(paramsModel.getString(key))) {
+                return false;
             }
         }
 
-        if (allKeysPresentAndNotEmpty) {
-            inv.invoke(); // 所有参数都存在且不为空,放行
-        } else {
-            // 参数校验失败时的错误信息
-            String errorMsgBuilder = "参数缺失或为空,请检查以下参数: " +
-                    EmptyInterceptor.formatParams(keyArray);
-
-            // 只返回错误信息
-            controller.renderJson(MyRet.fail(errorMsgBuilder));
-        }
+        return true;
     }
 
     public static String formatParams(String[] keyArray) {
         StringBuilder builder = new StringBuilder();
+
+        builder.append('[');
         for (int i = 0; i < keyArray.length; i++) {
             String key = keyArray[i];
-            builder.append("'").append(key).append("'");
-            if (i < keyArray.length - 1) builder.append(", ");
+
+            builder.append(key);
+
+            if (i < keyArray.length - 1) builder.append(',');
         }
+        builder.append(']');
+
         return builder.toString();
     }
-}
+}

+ 20 - 9
src/main/java/modules/user/UserController.java

@@ -1,15 +1,16 @@
 package modules.user;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.aop.Inject;
-import com.jfinal.core.Controller;
 import com.jfinal.kit.HashKit;
 import com.jfinal.kit.StrKit;
 import common.interceptor.empty.EmptyInterface;
 import common.model.User;
+import common.utils.http.MyController;
 import common.utils.http.MyRet;
 import common.utils.http.VerifyCode;
 
-public class UserController extends Controller {
+public class UserController extends MyController {
     // 验证码发送延时
     private static final long SEND_VERIFY_CODE_DELAY = 60 * 1000;
 
@@ -25,9 +26,15 @@ public class UserController extends Controller {
 
     @EmptyInterface(keyArray = {"mobile_number"})
     public void sendVerifyCode() {
-        // 前置校验        
-        String mobile_number = getPara("mobile_number");
-        
+        // --- 核心修改部分 ---
+        // 通过 MyController 获取解析后的 JSON 对象,拦截器也使用了这个方法
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+
+        // 从 JSON 对象中获取 mobile_number
+        String mobile_number = requestBodyJson.getString("mobile_number");
+
+        // 走到这里时,EmptyInterceptor 已经保证了 mobile_number 不会是 StrKit.isBlank()
+
         // 1. 校验手机号是否被注册
         if (service.isUserExists(mobile_number)) {
             renderJson(MyRet.fail("该手机号已被注册。"));
@@ -70,10 +77,14 @@ public class UserController extends Controller {
 
     @EmptyInterface(keyArray = {"mobile_number", "pwd_md5", "repeat_pwd_md5", "verify_code"})
     public void register() {
-        String mobileNumber = getPara("mobile_number");
-        String pwd = getPara("pwd_md5");
-        String repeatPwd = getPara("repeat_pwd_md5");
-        String userVerifyCode = getPara("verify_code"); // 用户提交的验证码
+        // --- 核心修改部分:从 JSON 请求体中获取参数 ---
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+
+        // 因为 EmptyInterceptor 已经保证了这些字段不为空,这里可以直接获取
+        String mobileNumber = requestBodyJson.getString("mobile_number");
+        String pwd = requestBodyJson.getString("pwd_md5");
+        String repeatPwd = requestBodyJson.getString("repeat_pwd_md5");
+        String userVerifyCode = requestBodyJson.getString("verify_code");
 
         // 2. 密码重复校验
         if (!pwd.equals(repeatPwd)) {

+ 11 - 7
src/test/rest/UserControllerTest.http

@@ -1,14 +1,18 @@
 ### 发送验证码
 POST {{ baseUrl }}/user/sendVerifyCode
-Content-Type: application/x-www-form-urlencoded
+Content-Type: application/json
 
-mobile_number=17781855864
+{
+  "mobile_number": "17781855864"
+}
 
 ### 注册
 POST {{ baseUrl }}/user/register
-Content-Type: application/x-www-form-urlencoded
+Content-Type: application/json
 
-mobile_number=17781855864 &
-pwd_md5=e10adc3949ba59abbe56e057f20f883e &
-repeat_pwd_md5=e10adc3949ba59abbe56e057f20f883e &
-verify_code=6583
+{
+  "mobile_number": "17781855864",
+  "pwd_md5": "e10adc3949ba59abbe56e057f20f883e",
+  "repeat_pwd_md5": "e10adc3949ba59abbe56e057f20f883e",
+  "verify_code": "2529"
+}