Expo+Axios在iOS上GET请求报Network Error,Android/Web正常
解决方案:Expo iOS端Axios GET请求失败问题
1. 检查并配置iOS ATS(App Transport Security)
iOS默认对网络请求有严格的安全限制,即使是HTTPS域名也可能因配置问题被拦截。在app.json中添加目标域名的ATS例外配置:
{ "expo": { // 其他原有配置... "ios": { "infoPlist": { "NSAppTransportSecurity": { "NSExceptionDomains": { "你的pythonanywhere域名.com": { "NSIncludesSubdomains": true, "NSExceptionAllowsInsecureHTTPLoads": false, // 正式环境保持false,测试可临时设为true "NSExceptionRequiresForwardSecrecy": false } } } } } } }
上线前务必确保后端使用合法的SSL证书,避免依赖NSExceptionAllowsInsecureHTTPLoads绕过安全校验。
2. 修正Axios GET请求的参数/Headers处理
GET请求的参数需放在params字段而非data,同时校验Token的传递格式:
const verifyUser = useCallback(async () => { const token = await _retrieveData("authToken"); try { const response = await axios.get("https://你的域名.com/api/verify", { params: { // 此处放置GET请求所需参数,如user_id等 }, headers: { Authorization: `Bearer ${token}`, // 确认Token前缀(如Bearer)是否符合后端要求 "Content-Type": "application/json" } }); console.log(response.data); } catch (error) { console.error("GET请求失败详情:", error); } }, []);
检查自定义useApi Hook中是否统一处理了GET请求的参数逻辑,避免误将参数放入data导致请求格式错误。
3. 确认Django后端CORS配置
确保Django的CORS中间件允许iOS端请求,在settings.py中调整配置:
INSTALLED_APPS = [ # 其他应用... 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 需放在CommonMiddleware之前 'django.middleware.common.CommonMiddleware', # 其他中间件... ] # 测试环境可允许所有来源,上线后替换为具体域名 CORS_ALLOW_ALL_ORIGINS = True # 上线时指定允许的域名 # CORS_ALLOWED_ORIGINS = [ # "exp://你的Expo测试地址", # "https://你的正式App域名", # ] # 确保GET方法被允许 CORS_ALLOW_METHODS = [ 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', ]
4. 调试排查步骤
- 清除Expo缓存后重新运行:执行
expo start --clear,避免旧配置残留。 - 切换到iOS真机测试:模拟器可能存在代理或网络环境问题,真机测试更贴近真实场景。
- 抓包对比差异:使用Charles等工具抓取iOS端的请求,对比正常API工具的请求Headers、参数编码是否一致。
内容的提问来源于stack exchange,提问作者Irshad Irshuu
相关产品推荐
相关产品推荐

