问题描述
postL(url, data, callback) {
let formData = new URLSearchParams();
Object.keys(data).forEach((key)=>{
if(!(data[key] === undefined) && !(data[key] === null))
formData.append(key,data[key]);
});
let realUrl = baseUrl + url;
fetch(realUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
},
body: formData
})
.then(response => {
if (response.ok) {
if(response._bodyText) return JSON.parse(response._bodyText);
else return null;
}
throw new Error('状态码:'+response.status+'错误信息:'+response._bodyText);
})
.then(responseText => {
callback(responseText);
})
.catch(err => {
alert(err.toString());
})
},
此段代码在debug模式下,登陆功能完全没有问题
但在release模式下,后台的返回信息是“username和password不能为空”
这就很奇怪了!!!!
一波三折的寻找原因
找到错误的地方实在是太难了,找了几天,最后将错误定位在了fetch传递FormData格式的数据上。
这样写,release模式ok:
这样写,debug模式ok:
那要怎么样才能让两个模式都ok呢!
最后发现是因为,debug模式下的FormData跟RN的FormData不是同一个东西。晕!!
https://github.com/jhen0409/react-native-debugger/issues/38
解决办法
在入口文件加入这段代码
GLOBAL.FormData = GLOBAL.originalFormData ? GLOBAL.originalFormData : GLOBAL.FormData;
修改postL(url,data,callback){}
postL(url, data, callback) {
let formData = new FormData();
Object.keys(data).forEach((key) => {
if (!(data[key] === undefined) && !(data[key] === null))
formData.append(key, data[key]);
});
let realUrl = baseUrl + url;
fetch(realUrl, {
method: 'POST',
body: formData
})
.then(response => {
if (response.ok) {
if (response._bodyText) return JSON.parse(response._bodyText);
else return null;
}
throw new Error('状态码:' + response.status + '错误信息:' + response._bodyText);
})
.then(responseText => {
callback(responseText);
})
.catch(err => {
alert(err.toString());
})
},
将URLSearchParams改为FormData;并去删掉headers,因为fetch会自动识别格式。