ios - Ionic 4 iOS 应用程序对 API 的请求引发错误未知,状态 0
问题描述
我有一个带有 Angular 应用程序的 Ionic 4 连接到我的 API。在 Android / 浏览器上,对 API 的调用正在运行(控制台上没有错误)。但是在 iOS 上,我有时会收到错误 "status":0,"statusText": "Unknown Error"
ERROR: {
"headers":{"normalizedNames":{},
"lazyUpdate":null,
"headers":{}},
"status":0,
"statusText": "Unknown Error",
"url":"https://api.domain.com/v2/profile",
"ok":false,
"name":"HttpErrorResponse",
"message":"Http failure response for https://api.domain.com/v2/profile: 0 Unknown Error",
"error":{"isTrusted":true}}
奇怪的是,这种情况并非一直都在发生。
设想:
- Angular httpClient GET 调用https://api.domain.com/v2/profile => 有效,取回数据
- 另一个 GET 调用(发生导航)到https://api.domain.com/v2/list => Works
- 返回上一页,对https://api.domain.com/v2/profile的新 GET 调用失败并抛出上述错误。
不管你导航多少次,它都会随机抛出上述错误。如果它与 CORS 有任何关系,我认为它会在您每次在 iOS 上发出请求时抛出错误。
离子信息
离子:
Ionic CLI : 5.2.7 (/usr/local/lib/node_modules/ionic)
Ionic Framework : @ionic/angular 4.8.1
@angular-devkit/build-angular : 0.801.3
@angular-devkit/schematics : 8.3.2
@angular/cli : 8.3.2
@ionic/angular-toolkit : 2.0.0
Cordova:
Cordova CLI : 9.0.0 (cordova-lib@9.0.1)
Cordova Platforms : ios 5.0.1
Cordova Plugins : cordova-plugin-ionic-keyboard 2.1.3, cordova-plugin-ionic-webview 4.1.1, (and 10 other plugins)
Utility:
cordova-res : 0.6.0
native-run : 0.2.8
System:
ios-sim : 8.0.2
NodeJS : v10.16.3 (/usr/local/bin/node)
npm : 6.9.0
OS : macOS Mojave
Xcode : Xcode 10.2.1 Build version 10E1001
Safari 控制台截图:https ://imgur.com/a/BNXAB7Y
解决方案
这个答案让我找到答案Preflight response is not successful with proper headers
ionic 的常见问题解答有助于理解https://ionicframework.com/docs/faq/cors。
对我来说,这个 Apache 的配置工作在虚拟主机 conf 中完成:
# Always set these headers.
#you can restrict the domain to allow here
SetEnvIf Origin "^(.*)$" AccessControlAllowOrigin=$0
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
推荐阅读
- google-sheets - 逐月百分比变化的计算字段
- mysql - 更新后触发插入额外记录(使用 mySQLWorkbench)
- php - 在一台服务器 Laravel 中的两个项目之间调用 curl
- python - 在以下代码中定义 tensorflow 2.+ 中的损失函数的正确方法是什么?
- html - 弹性列容器中项目之间的间距
- javascript - Puppeteer:for 循环 - 语法问题
- html - 背景图像 (CSS) 不会出现在网站上
- python-3.x - Selenium Wire Chrome 驱动程序失去互联网连接
- c# - 在 MVC 中将 ID 替换为名称
- flutter - Flutter TextField:多行,但不换行