React Native调用POST API返回200但响应为空问题求助
问题排查与解决方案
兄弟,我看你这问题卡了挺久,先帮你梳理下核心问题,再给你两个可行的解决思路:
一、先修复当前base64请求的问题
你现在的代码有两个容易忽略的细节,直接导致了“请求200但看起来响应为空”的情况:
1. 请求体格式不对
你设置了Content-Type: application/json,但直接把base64字符串作为body传递,而绝大多数接受base64的API,都要求把编码内容放到JSON的指定字段里(比如image),不是直接传裸字符串。
2. 未解析实际响应内容
你打印的res是Fetch的响应对象,不是服务器返回的实际数据,必须调用res.json()或res.text()才能读取里面的内容。
修改后的base64请求代码:
recognise = (imageToRead) => { RNFetchBlob.fs.readFile(imageToRead, 'base64') .then((data) => { // 按API要求构造JSON请求体,这里假设API用`image`字段接收base64,具体看文档调整 const requestBody = JSON.stringify({ image: data }); return fetch('${url}', { method: "POST", headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: requestBody }); }) .then((res) => res.json()) // 解析实际响应内容 .then((responseData) => { console.log('服务器返回的真实内容:', responseData); }) .catch((err) => { console.log('请求或解析错误:', err); }); };
二、React Native下FormData上传方案(推荐,毕竟Node环境验证过可行)
既然API支持FormData上传,用这个方式更稳妥,还能避免base64编码的额外开销。你已经在用react-native-fetch-blob,直接用它实现即可:
recognise = (imageToRead) => { // 创建FormData对象,key要和Node测试代码里的`image`完全一致 const formData = new FormData(); formData.append('image', { uri: imageToRead, type: 'image/jpeg', // 根据你的图片类型调整,png就用image/png name: 'upload.jpg' }); RNFetchBlob.fetch('POST', '${url}', { // 自动处理multipart/form-data的边界符,不用手动写 'Content-Type': 'multipart/form-data', }, formData) .then((res) => res.json()) .then((responseData) => { console.log('上传成功,响应内容:', responseData); }) .catch((err) => { console.log('上传失败:', err); }); };
注意点:
- iOS本地文件的uri就是你拿到的
/var/mobile/...路径,不需要额外处理 type字段必须和实际图片格式匹配,否则API可能识别不了文件- FormData的key(这里是
image)要和Node测试代码的key保持一致,API是靠这个key识别上传文件的
补充说明
你之前看到的响应对象里的_bodyBlob是Fetch的响应体容器,必须通过解析方法才能读取里面的内容,这也是你之前误以为“响应为空”的原因——你只是打印了响应的元数据,没触达实际内容。
内容的提问来源于stack exchange,提问作者obiwankenoobi
相关产品推荐
相关产品推荐

