不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2025-06-13 17:24:44  修改时间:2025-06-15 03:38:08  分类:07.Java框架/系统  编辑

解析目标

  1. 使用 分号(:或:) 分隔参数名和参数值;
  2. 使用换行符(\n)来区分上下键值对(参数名:参数值);
  3. 参数值中,是可以包含 分隔符(:或:)和换行符(\n);

1、参数解析器文件:ParamParser.java

package com.ddd.application.service.extend;

import cn.hutool.core.text.StrSplitter;
import cn.hutool.core.util.StrUtil;
import com.ddd.common.helper.EmptyHelper;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static com.ddd.application.config.TaskFieldsConfig.fieldList;

/**
 * 参数解析器
 */
@Component
public class ParamParser {
    /**
     * 参数解析
     *
     * @param paramStr 参数字符串
     */
    public List<Map<String, Object>> parse(String paramStr) {
        List<String> lineList = StrUtil.split(paramStr, "\n");

        Map<String, Object> taskParams = EmptyHelper.emptyLinkedHashMap();
        Map<String, Object> apiParams = EmptyHelper.emptyLinkedHashMap();


        String separator = "[:|:]";
        String key = "";
        String value = "";

        boolean _isKey = false;
        String _key = "";
        String _value = "";

        for (String line : lineList) {
            List<String> keyValue = StrSplitter.splitByRegex(line, separator, 2, false, false);
            if (keyValue.size() >= 2) {
                _key = keyValue.get(0).trim();
                _value = keyValue.get(1);
            } else {
                _key = "";
                _value = "";
            }

            // 注意:不为空的值,才是有效的Key
            if (StrUtil.isNotEmpty(_key)) {
                _isKey = true;
            } else {
                _isKey = false;
            }

            if (_isKey) {
                // 保存上一次计算的“键值对“
                if (StrUtil.isNotEmpty(key)) {
                    if (fieldList.contains(key)) {
                        taskParams.put(key, value);
                    } else {
                        apiParams.put(key, value);
                    }
                }
                key = _key;
                value = _value;
            } else {
                value += "\n" + line;
            }
        }

        // 保存最后一次计算的“键值对“
        if (StrUtil.isNotEmpty(key)) {
            if (fieldList.contains(key)) {
                taskParams.put(key, value);
            } else {
                apiParams.put(key, value);
            }
        }

        return Arrays.asList(taskParams, apiParams);
    }
}

 

2、测试文件:Albert_Test_01.java

package com.ddd;

import cn.hutool.core.text.StrSplitter;
import com.ddd.application.service.extend.ParamParser;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.Map;

@SpringBootTest()
public class Albert_Test_01 {
    @Resource
    private ParamParser paramParser;

    @Test
    void test_01() {
        // 解析请求参数
        String paramStr = """
            任务ID:f5zvdnish1ggx
            任务发起对象:DDD客服小助手
        在Java的String对象中提供了
        
        
        split方法用于通过
            任务总步骤数:20
            任务输出文本:xxyyzz
            任务当前步骤:3
            =====================
            任务异常信息:test
            任务状态:已完成
            wenjianbao
            
            请求ID: XX003
            请求URL: https://php-note.com
            请求内容: xxx:123, yyy:456
            
            """;

         List<Map<String, Object>> paramList = paramParser.parse(paramStr);
        System.out.println(paramList);
    }

    /**
     * 测试  StrSplitter.splitByRegex() 方法
     */
    @Test
    void test_02() {
        String separator = "[:|:]";
        String line = """
            :20
            任务输出文本:xxyyzz
            温建宝
            """;
        List<String> keyValue = StrSplitter.splitByRegex(line, separator, 2, false, false);
        System.out.println(keyValue.size());
        System.out.println(keyValue);
    }
}

 

输出内容:

[{任务ID=f5zvdnish1ggx, 任务发起对象=DDD客服小助手
在Java的String对象中提供了


split方法用于通过, 任务总步骤数=20, 任务输出文本=xxyyzz, 任务当前步骤=3
    =====================, 任务异常信息=test, 任务状态=已完成
    wenjianbao
}, {请求ID= XX003, 请求URL= https://php-note.com, 请求内容= xxx:123, yyy:456

}]

3、任务表字段文件:TaskFieldsConfig.java

package com.ddd.application.config;

import java.util.ArrayList;

/**
 * 任务字段
 */
public class TaskFieldsConfig {
    public static ArrayList<String> fieldList = new ArrayList<>();

    static {
        fieldList.add("任务ID");
        fieldList.add("任务名称");
        fieldList.add("任务发起对象");
        fieldList.add("任务执行接口");
        fieldList.add("任务接口授权ID");
        fieldList.add("任务输入文本");
        fieldList.add("任务输入附件");
        fieldList.add("任务输出文本");
        fieldList.add("任务输出附件");
        fieldList.add("任务总步骤数");
        fieldList.add("任务当前步骤");
        fieldList.add("任务状态");
        fieldList.add("任务异常信息");
        fieldList.add("任务开始时间");
        fieldList.add("任务结束时间");

    }
}

4、控制器文件:TaskController

package com.ddd.application.controller;

import com.ddd.application.config.UrlConfig;
import com.ddd.application.service.extend.ParamParser;
import com.ddd.common.model.Result;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class TaskController {
    @Resource
    private ParamParser paramParser;

    /**
     * 添加任务
     */
    @PostMapping(UrlConfig.task_add)
    public Result<Object> addTask() {
        return Result.ok();
    }

    /**
     * 更新任务
     */
    @PostMapping(UrlConfig.task_update)
    public Result<Object> updateTask() {
        return Result.ok();
    }

    /**
     * 更新任务状态
     */
    @PostMapping(UrlConfig.task_updateStatus)
    public Result<Object> updateTaskStatus() {
        return Result.ok();
    }

    /**
     * 删除任务
     */
    @PostMapping(UrlConfig.task_delete)
    public Result<Object> deleteTask() {
        return Result.ok();
    }

    /**
     * 获取任务详情
     */
    @PostMapping(UrlConfig.task_info)
    public Result<Object> getTaskInfo() {
        return Result.ok();
    }

    /**
     * 获取任务状态
     */
    @ResponseBody
    @PostMapping(UrlConfig.task_status)
    public Result<Object> getTaskStatus(@RequestBody String requestBody) {
        List<Map<String, Object>> params = paramParser.parse(requestBody);
        System.out.println(params);
        return Result.ok();
    }
}