未为 iOS 上的 POST 请求设置超时间隔

Posted

技术标签:

【中文标题】未为 iOS 上的 POST 请求设置超时间隔【英文标题】:Timeout interval not set for POST requests on iOS 【发布时间】:2021-12-30 03:46:42 【问题描述】:

我通过此代码将所有请求的 timeOutInterval 设置为 30 秒:

class DefaultAlamofireSession: Alamofire.Session 
    static let shared: DefaultAlamofireSession = 
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30
        configuration.timeoutIntervalForResource = 30
        return DefaultAlamofireSession(configuration: configuration)
    ()

在测试时,我注意到只有我的 GET 请求在 30 秒时超时。我的 POST 请求仍在使用默认间隔,即 60 秒。

谁能解释为什么并可能告诉我如何使 POST 请求也超时 60 秒?

非常感谢, 辣椒粉

【问题讨论】:

【参考方案1】:

URLSessionConfiguration.timeoutIntervalForRequest 并没有按照你的想法去做。来自 Apple 的文档:

此属性根据此配置确定会话中所有任务的请求超时间隔。请求超时间隔控制任务在放弃之前应该等待额外数据到达的时间(以秒为单位)。每当有新数据到达时,与此值关联的计时器就会重置。当请求定时器达到指定的时间间隔而没有收到任何新数据时,就会触发超时。

因此该属性仅控制响应Data 的超时之间 块。这通常不是你想要的。相反,您想直接设置URLRequest.timeoutInterval,这可以满足您的更多需求。

如果在连接尝试期间请求保持空闲的时间超过超时间隔,则认为该请求已超时。默认超时间隔为 60 秒。

如您所见,此超时适用于连接尝试,这是大多数人认为的请求超时。

您可以通过将RequestAdapter 应用于您的自定义Session,在Alamofire 中自定义此值。或者,您可以使用各种 request* 方法上可用的 requestModifier 闭包。

【讨论】:

非常感谢您的回答。您能否举一个代码示例说明如何使用 RequestAdapter 或 requestModifier 来做到这一点?

以上是关于未为 iOS 上的 POST 请求设置超时间隔的主要内容,如果未能解决你的问题,请参考以下文章

IIS 请求 超时设置

uniapp post请求万条数据就超时,那百万条数据怎么处理呢?

设置超时或设置间隔?

restkit 0.20.0 中的请求超时

设置 URLSession 超时间隔

JAVA通用GET和POST方法