Expo应用Android端Image2Image API请求失败,iOS端正常
Expo Android端Image2Image API请求失败排查与解决
问题现象
Expo应用调用Dezgo的Image2Image API时,iOS端运行正常,Android端持续抛出错误:Network request failed at node_modules/whatwg-fetch/dist/fetch.umd.js:535:30 in setTimeout$argument_0。但同项目中调用Text2Image API的相似请求在双平台均能正常工作,已尝试axios替代fetch、表单上传图片(而非Base64)等方案,均未解决问题。
问题代码(Image2Image请求)
if (imageResult != null){ dispatch(setImageResult(null)) } let base64Image = await uriToBase64(avatarImage); base64Image = base64Image.replace(/^data:image/[a-z]+;base64,/, ""); let response = await fetch('https://api.dezgo.com/image2image', { method: 'POST', headers: { 'X-Dezgo-Key': '// api key', 'Content-Type': 'application/json' }, body: JSON.stringify({prompt: selectedModel.prompt, init_image: base64Image, strength: 0.5, model: selectedModel.model, upscale: 2}) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } else { if (imageResult != null){ dispatch(setImageResult(null)) } const blobToBase64 = (blob) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); }; const imageBlob = await response.blob(); let base64Image = await blobToBase64(imageBlob); dispatch(setImageResult(base64Image)); dispatch(setAvatarImage(null)) dispatch(setIsQuality(false)) }
正常代码(Text2Image请求)
if (imageResult != null){ dispatch(setImageResult(null)) } if(selectedModelDream.prompt !== null){ finalPrompt = (finalPrompt + ' ' + selectedModelDream.prompt) finalNegativePrompt = selectedModelDream.negative_prompt } let response = await fetch('https://api.dezgo.com/text2image', { method: 'POST', headers: { 'X-Dezgo-Key': '// api key', 'Content-Type': 'application/json' }, body: JSON.stringify({prompt: finalPrompt, guidance: 7, model: selectedModelDream.model, upscale: 2, width: selectedAspectRatioDream.width, height: selectedAspectRatioDream.height}) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } else { if (imageResult != null){ dispatch(setImageResult(null)) } const blobToBase64 = (blob) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); }; const imageBlob = await response.blob(); let base64Image = await blobToBase64(imageBlob); dispatch(setImageResult(base64Image)); dispatch(setIsQuality(false)) }
排查与解决方案
1. 修正正则表达式错误
问题代码中Base64前缀替换的正则写法有误:
// 错误写法 base64Image = base64Image.replace(/^data:image/[a-z]+;base64,/, "");
这里的/^data:image/[a-z]+会被解析为两个无效正则,Android端对正则错误的容忍度更低,导致Base64格式损坏,API无法解析后触发网络请求失败。
修正为:
base64Image = base64Image.replace(/^data:image\/[a-z]+;base64,/i, "");
- 转义斜杠
\/避免正则语法错误 - 添加
i标记忽略大小写,兼容不同格式的图片前缀
2. 改用Multipart表单上传(规避JSON大小限制)
Android端对JSON请求体的大小有限制,Image2Image的Base64数据远大于Text2Image的文本数据,容易触发限制。之前尝试表单上传失败可能是手动设置了Content-Type导致缺少boundary参数,正确示例:
const formData = new FormData(); formData.append('prompt', selectedModel.prompt); formData.append('init_image', { uri: avatarImage, name: 'init_image.jpg', type: 'image/jpeg' }); formData.append('strength', 0.5); formData.append('model', selectedModel.model); formData.append('upscale', 2); let response = await fetch('https://api.dezgo.com/image2image', { method: 'POST', headers: { 'X-Dezgo-Key': '// api key' // 不要手动设置Content-Type: multipart/form-data,fetch会自动添加带boundary的正确头 }, body: formData });
3. 检查网络权限配置
确认app.json中已包含Android网络权限:
{ "expo": { "android": { "permissions": ["INTERNET"] } } }
Expo默认会添加该权限,但裸机项目需确保AndroidManifest.xml中也存在<uses-permission android:name="android.permission.INTERNET" />。
4. 优化错误捕获
添加更精准的错误区分,便于排查:
try { // 请求代码 } catch (error) { if (error.message.includes('Network request failed')) { console.log('网络连接异常:', error); } else { console.log('API返回错误:', error); } }
内容的提问来源于stack exchange,提问作者Rek
相关产品推荐
相关产品推荐

