You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:53:15