使用 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 方法?

使用Jersey的Http DELETE参数

在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用

@DELETE 上的 Jersey 错误:“不支持的 HTTP 方法:DELETE”

$http.delete 在 angularJS 中抛出错误