You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在发送JSON请求体前移除表情符号?Kotlin HttpClient方案优化

优化的JSON请求体表情符号清洗方案

你的现有代码存在一个关键问题:先执行了原请求execute(request)再处理请求体,这会导致带表情的原始请求已经发送出去,后续清洗操作完全无效。下面是修正后的更优实现方案:

核心思路

  1. 先判断请求的Content-Type是否为JSON(兼容带字符编码的场景,比如application/json;charset=utf-8)
  2. 读取原请求体的字符串内容
  3. 用正则表达式移除所有表情符号
  4. 重新构建清洗后的请求并执行

完整代码实现

// 预编译表情符号正则,避免每次请求重复编译
val emojiRegex = Regex(
    "[\\u1F600-\\u1F64F\\u1F300-\\u1F5FF\\u1F680-\\u1F6FF\\u1F1E0-\\u1F1FF\\u2600-\\u26FF\\u2700-\\u27BF\\uFE0F]+"
)

HttpClient {
    // 你的其他配置(如引擎、日志插件等)
}.plugin(HttpSend).intercept { request ->
    val contentType = request.content.contentType
    // 兼容所有JSON类型的Content-Type判断
    val isJson = contentType?.match(ContentType.Application.Json) == true

    if (isJson) {
        // 读取原请求体文本
        val originalBody = request.content.readText()
        // 移除表情符号
        val sanitizedBody = emojiRegex.replace(originalBody, "")
        // 重新构建请求内容,保留原Content-Type
        val sanitizedContent = sanitizedBody.toByteArray().toContent(contentType)
        // 执行清洗后的请求
        execute(request.copy(content = sanitizedContent))
    } else {
        // 非JSON请求直接放行
        execute(request)
    }
}

关键优化点

  • 前置拦截逻辑:先处理请求体再执行请求,彻底避免无效的原始请求发送
  • 兼容多场景JSON类型:使用ContentType.Application.Json.match()方法,自动匹配带字符编码的JSON类型
  • 性能优化:预编译正则表达式,减少重复编译带来的性能损耗
  • 请求完整性保留:仅替换请求体内容,保留原请求的其他所有属性(如请求头、方法、URL等)

补充说明

  • 如果请求体使用非UTF-8编码,可在readText()中指定对应字符集,比如readText(Charsets.UTF_16)
  • 若需要保留特定表情符号,可修改正则表达式排除对应的Unicode范围

内容的提问来源于stack exchange,提问作者Sultan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:25:02