使用 DELETE 的 HTTP 调用在 iOS 上失败,在 Android 上成功
Posted
技术标签:
【中文标题】使用 DELETE 的 HTTP 调用在 iOS 上失败,在 Android 上成功【英文标题】:HTTP call using DELETE fails on iOS, succeeds on Android 【发布时间】:2021-07-07 14:22:26 【问题描述】:我正在使用 Vue.js 从 Cordova (Monaca) 应用程序调用 API。该代码与平台无关,适用于 android 和浏览器预览。相关部分只需调用this.$http.delete(url, config)
并记录响应。 this.$http
来自https://github.com/pagekit/vue-resource。
在 ios 上,我在记录响应时收到此消息:
"url": "https://domain.whatever?KEY=12345&receipt_id=12345",
"ok": false,
"status": 0,
"statusText": "",
"headers":
"map":
"": [
""
]
,
"body": "",
"bodyText": ""
同样的调用,在 Android 上,得到这个结果:
"url": "https://domain.whatever?KEY=12345&receipt_id=12345",
"ok": true,
"status": 200,
"statusText": "OK",
"headers":
"map":
"connection": [
"Keep-Alive"
],
"content-encoding": [
"gzip"
],
"content-length": [
"17"
],
"content-type": [
"application/json"
],
"date": [
"Mon, 12 Apr 2021 12:51:56 GMT"
],
"keep-alive": [
"timeout=5, max=100"
],
"server": [
"Apache"
],
"vary": [
"Accept-Encoding"
]
,
"body":
"status": "OK"
,
"bodyText": "\"status\": \"OK\""
(日志经过轻微编辑以删除私人数据并缩进以提高可读性。)
什么可以解释 iOS 的失败? iOS 是否应用了某种默认过滤器来阻止 HTTP DELETE 请求? POST 和 GET 请求似乎在移动平台上表现一致。
【问题讨论】:
只有 DELETE 失败了吗? POST 有效吗? 是的@Eric。只删除。 【参考方案1】:默认情况下,iOS 会阻止不安全的 HTTP 请求:
https://developer.apple.com/documentation/security/preventing_insecure_network_connections
勾选仅在需要时配置例外;首选 Server Fixes 部分以查看如何添加覆盖此行为。
【讨论】:
谢谢,这很有见地!虽然所有连接都是 HTTPS,但是否有任何原因导致 DELETE 请求最终被阻止而 GET 请求会定期通过? 抱歉,我错过了您的请求是 HTTPS。不确定这是否是您的情况,但在 iOS 上存在影响 WKWebView 的错误:developer.apple.com/forums/thread/653662 将 'Access-Control-Allow-Origin' 设置为 '*' 是不够的,您应该将其设置为与请求相同的值“原点”标题。 有可能!仍然不容易找出这是否是罪魁祸首,因为我被一大堆框架、库等所淹没,而且要找出强制执行的实际配置并不容易。以上是关于使用 DELETE 的 HTTP 调用在 iOS 上失败,在 Android 上成功的主要内容,如果未能解决你的问题,请参考以下文章
Java中使用HttpRequest调用RESTfull的DELETE方法接口提示:How to fix HTTP method DELETE doesn't support output
为啥 Extjs 4.0.7 TreeStore 会自动调用 http delete 方法?
在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用