//请求参数转义
const objToQueryString = (obj) => {
return Object.keys(obj)
.filter(key => obj[key] !== undefined && obj[key] !== null)
.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
.join('&');
}
//登录接口
uni.request({
url: BASE_URL + "/api/login",
method: "POST",
data: objToQueryString(postData),
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: (res) => {
uni.hideLoading()
loading.value = false
if (res.data.code == 200) {
try {
uni.setStorageSync("userInfo", res.data.data)
uni.setStorageSync("TOKEN", res.data.token)
uni.setStorageSync("TOKEN_KEY", res.data.tokenKey)
uni.showToast({
title: '登录成功',
icon: 'success',
duration: 1500
})
setTimeout(() => {
uni.switchTab({
url: "/pages/home/index"
})
}, 500)
} catch (e) {
console.error(e)
}
} else {
uni.showToast({
title: res.data.msg || '登录失败',
icon: 'none',
duration: 2000
})
}
},
fail: (err) => {
uni.hideLoading()
loading.value = false
uni.showToast({
title: '网络异常,请重试',
icon: 'none',
duration: 2000
})
}
})
2 个回复
DCloud_UNI_yuhe
您好,请提供一下报错信息
Ask小助手
感谢您的反馈。针对您提交的 Bug 报告,我们进行了详细的评审与分析,以下是具体的评审意见与排查建议:
1. Bug 反馈内容完整性评审
uni.request登录接口的调用逻辑,但不够完整。代码中缺少了postData的来源与定义、BASE_URL的声明,以及关键的上下文环境(如该段代码是否处于特定的条件编译中,是否包含uni.login获取 code 的前置逻辑等)。这会导致官方人员无法直接复制运行复现,需要自行补全缺失的变量与上下文。uni.request的fail回调提示“网络异常”,还是进入了success回调但业务状态码非 200?),这会影响问题定性的判断。2. 代码逻辑与问题分析
从您提供的代码来看,登录接口使用
uni.request发送 POST 请求,并手动将postData通过objToQueryString转换为 URL 编码的字符串,同时设置了header: { 'content-type': 'application/x-www-form-urlencoded' }。在常规的 iOS 和 Android 微信小程序中,这种手动转换参数的做法通常能正常工作。但在鸿蒙系统的微信小程序底层实现中,对于网络请求的参数序列化处理可能存在差异。当
content-type为application/x-www-form-urlencoded时,如果手动传入已经序列化完成的字符串,底层可能会再次对其进行编码或因格式预期不一致导致请求体解析异常,从而使得服务端无法正确接收参数,导致登录失败。3. Bug 是否成立及替代方案
基于现有信息与知识库,目前无法直接判定为框架底层的 Bug,更倾向于这是跨平台网络请求参数序列化的环境差异问题。建议您尝试以下方案进行验证与修复:
方案一:直接传递 Object 对象(推荐)
在
uni.request中,当method为POST且header设置为application/x-www-form-urlencoded时,框架本身会自动将数据对象转换为 URL 编码字符串。无需手动调用objToQueryString,直接传入原始对象即可,这样可以避免因底层环境差异导致的二次编码问题。修改后的代码示例:
方案二:补充信息以进一步确认
如果采用方案一后问题依然存在,请补充以下信息以便我们进一步排查是否为底层 Bug:
postData定义及完整的请求上下文)。uni.request是触发了fail回调还是进入了success但res.data.code != 200,并打印出具体的err或res.data内容。建议您先尝试调整代码中的参数传递方式,通常这能解决大部分因平台底层序列化差异导致的请求失败问题。
要回复问题请先登录或注册
公告
更多>相关问题