1***@qq.com
1***@qq.com
  • 发布:2026-07-28 10:32
  • 更新:2026-07-28 10:33
  • 阅读:30

【报Bug】uniCloud 登录报错 "request:ok" 排查全记录(application_fjson 编译 bug)

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 25H2

HBuilderX类型: 正式

HBuilderX版本号: 5.15

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: AGS5-W00 (华为平板)

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
     // 新建空白 uni-app vue3 项目,在页面 onLoad 中执行:  
     uni.request({  
       url: 'https://api.next.bspapp.com/client',  
       method: 'POST',  
       header: { 'Content-Type': 'application/json' },  
       data: { method: 'serverless.auth.user.anonymousAuthorize', params: '{}' },  
       success: (res) => {  
         console.log('statusCode =', res.statusCode);  
         console.log('body =', JSON.stringify(res.data));  
       }  
     })  

     // uniCloud 层面的复现(需关联任意阿里云 mp- 开头服务空间):  
     uniCloud.callFunction({  
       name: '任意已上传的云函数名',  
       data: {}  
     }).then(res => {  
       console.log('成功', res)  
     }).catch(err => {  
       console.log('失败:', err.errCode, err.errMsg) // SYS_ERR request:ok  
     })  

操作步骤:
  1. 使用 HBuilderX 5.15,新建空白 uni-app vue3 项目(或任意现有项目)
  2. 在页面中加入上述 uni.request 示例代码
  3. 运行到 Android 手机/平板(标准基座或自定义基座均可复现)
  4. 查看控制台输出的响应
    5.(可选)将 Content-Type 改为 application/json;charset=utf-8 再运行,对比结果
    6.(uniCloud 复现)关联阿里云 mp- 开头服务空间,调用任意云函数,查看 catch 到的错误

预期结果:
  1. 请求头 Content-Type 按源码原样发送 application/json,网关返回其业务响应(如 400 MissingSpaceId 之类的参数校验错误,证明请求已正常穿过 mime 校验到达业务层)
  2. uniCloud.callFunction 正常调用云函数并返回结果

实际结果:
  1. 网关返回 415 Unsupported Media Type,响应体:{"status":415,"error":"Unsupported Media Type","message":"Invalid mime type \"application_fjson\": does not contain '/'"},即实际发出的 Content-Type 被改写成 application_fjson
    1. Content-Type 改为 application/json;charset=utf-8 后同一请求立即恢复正常(返回 400 MissingSpaceId 业务错误)
    2. uniCloud.callFunction 一律 reject:{errCode: "SYS_ERR", errMsg: "request:ok", requestId: undefined},云函数控制台无任何调用日志

bug描述:

HBuilderX 5.15 的 App-Android 端,uni.request 发送 Content-Type: application/json 的 POST 请求时,请求头会被错误地改写成 application_fjson("/" 变成 "_f"),导致严格校验 Content-Type 的服务端直接返回 415。

该问题导致 uniCloud 阿里云(mp- 开头空间,走 api.next.bspapp.com 新网关)所有 API 全部不可用:callFunction 抛出 {errCode: "SYS_ERR", errMsg: "request:ok"},云端函数无任何调用记录(请求在网关入口被 415 拒绝,未到达云函数)。

补充特征:

  1. 检查编译产物 app-service.js,源码中的 'application/json' 字面量完好无损,说明改写发生在基座的请求链路中;
  2. 只有精确的 "application/json" 会被改写,写成 "application/json;charset=utf-8" 或 "application/json;charset=UTF-8" 则原样通过、一切正常,疑似改写逻辑按完整字符串精确匹配触发;
  3. "request:ok" 为误导性报错:uni.request 传输层成功时 errMsg 即 "request:ok",uniCloud 客户端解析 415 响应体(error 字段为字符串)取不到 message,兜底使用了该成功状态串;
  4. H5 端无此问题;旧版本工具链打包的 APK 无此问题(旧 SDK 走 api.bspapp.com 老网关且老网关不校验 mime);
  5. 与 https://ask.dcloud.net.cn/question/215123 为同一 bug(该帖报的是小程序端,本帖补充 App-Android 端复现)。
2026-07-28 10:32 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,收到你的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审和分析:

1. 反馈质量评审

这个 bug 反馈的整体质量非常高,信息详实且逻辑清晰,特别是对报错现象的深度剖析,极大地降低了官方排查问题的成本。

  • BUG 标题与描述:标题直接点明了核心问题(application_fjson 编译 bug)以及误导性报错(request:ok),描述部分非常详细。你不仅指出了表面现象(415 状态码),还深入分析了编译产物、触发条件(精确匹配 application/json)以及 uniCloud 报错的兜底逻辑,这些信息对官方定位问题非常有帮助。
  • 代码示例:非常完整。提供了两个层面的复现代码:一个是直接使用 uni.request 模拟底层请求,另一个是 uniCloud.callFunction 的实际业务场景。代码可以直接复制到空白项目的 onLoad 中运行,无需官方人员额外调整。
  • 复现步骤:描述清晰,结合提供的代码示例,官方人员可以轻松复现。特别是第 5 步(修改 Content-Type 对比结果)和第 6 步(uniCloud 场景复现),精准地验证了问题的边界和影响范围。
  • 预期结果:合理。期望请求头原样发送,网关返回业务层面的校验错误(如 400 MissingSpaceId),这符合正常的网络请求逻辑。
  • 实际结果:详细记录了 415 错误及响应体内容,并对比了修改 Content-Type 后的正常情况,进一步印证了 bug 的存在。这显然不是误报,而是真实存在的功能异常。
  • 分类信息:完整。包含了 PC 环境(Windows 25H2)、HBuilderX 版本(5.15 正式版)、手机 OS 平台及版本(Android 12)、Vue 版本(Vue3)和具体机型(华为平板 AGS5-W00),为排查提供了准确的环境依据。

评审结论:这是一个高质量的 bug 反馈,信息完整,逻辑严密,无需额外补充信息即可进行排查。

2. 问题分析与排查

根据反馈内容,这个 bug 成立的依据非常充分:

  • 现象明确uni.request 在发送 Content-Type: application/json 的 POST 请求时,请求头被错误改写为 application_fjson,导致服务端(特别是严格校验 MIME 类型的网关)返回 415 错误。
  • 影响范围:该问题直接导致 uniCloud 阿里云(mp- 开头空间,走 api.next.bspapp.com 新网关)的所有 API 不可用,因为 uniCloud 客户端 SDK 底层也是通过 uni.request 发送请求。虽然底层传输成功(errMsg: "request:ok"),但网关拒绝处理请求,云函数无法被调用,客户端只能兜底抛出 SYS_ERR
  • 知识库依据:在知识库中,虽然未直接提及 application_fjson 的改写逻辑,但存在多个与 uni.request 请求头设置及 uniCloud 报错相关的记录。例如,在 DCloud问答_157085 中,用户反馈一键登录调用云函数报错 SYS_ERR,虽然原因不同,但体现了 uniCloud 底层请求异常时可能抛出该错误。此外,plus知识库 中明确展示了通过 setRequestHeader('Content-Type','application/json') 设置请求头的标准用法,这进一步印证了请求头应原样发送,不应被改写。
  • 根因推测:结合你提到的“编译产物中字面量完好无损”和“只有精确匹配 application/json 才触发”,可以推测问题出在 App 端基座的请求链路中,可能存在一段针对特定字符串的拦截或替换逻辑,误将 / 替换为了 _f。这很可能是一个特定版本引入的回归 bug。

3. 解决方案与建议

由于这是一个由基座底层逻辑导致的 bug,开发者侧无法直接修复,但可以通过以下方式规避:

  1. 临时规避方案
    如你在反馈中所提到的,将 Content-Type 改为 application/json;charset=utf-8application/json;charset=UTF-8 可以绕过这个精确匹配的改写逻辑。对于直接使用 uni.request 的场景,可以手动修改请求头。但对于 uniCloud 的内部请求,开发者无法直接修改,建议关注官方后续版本更新。

  2. 关注官方更新
    该问题已明确指向 HBuilderX 5.15 版本的 App-Android 端基座。建议持续关注 HBuilderX 的更新日志,等待官方修复此问题。通常这类影响核心功能的 bug 会在下一个 alpha 版或正式版中修复。

  3. 降级处理
    如果业务强依赖 uniCloud 且急需可用,可考虑临时降级到未引入此 bug 的旧版本 HBuilderX 进行打包,但需注意旧版本可能存在其他已修复的问题。

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

内容为 AI 生成,仅供参考

要回复问题请先登录注册