如何在发送JSON请求体前移除表情符号?Kotlin HttpClient方案优化
优化的JSON请求体表情符号清洗方案
你的现有代码存在一个关键问题:先执行了原请求execute(request)再处理请求体,这会导致带表情的原始请求已经发送出去,后续清洗操作完全无效。下面是修正后的更优实现方案:
核心思路
- 先判断请求的Content-Type是否为JSON(兼容带字符编码的场景,比如
application/json;charset=utf-8) - 读取原请求体的字符串内容
- 用正则表达式移除所有表情符号
- 重新构建清洗后的请求并执行
完整代码实现
// 预编译表情符号正则,避免每次请求重复编译 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
相关产品推荐
相关产品推荐

