我如何检查 Alamofire 我的请求已发送?

Posted

技术标签:

【中文标题】我如何检查 Alamofire 我的请求已发送?【英文标题】:How could I check in Alamofire my request is sent? 【发布时间】:2018-10-08 09:50:21 【问题描述】:

无论是否收到响应,使用 Alamofire 都可以在发送请求时获取事件?就像这个 URLSession 方法一样:

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                            didSendBodyData:(int64_t)bytesSent
                             totalBytesSent:(int64_t)totalBytesSent
                   totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;

编辑: 我的代码是将 JSON 发送到服务器:

Alamofire.request("http://...", method: HTTPMethod.post, parameters: params, encoding: JSONEncoding.default,
                      headers: [...]).responseJSON 
                                    response in
                                    if response.result.isSuccess 
                                        print("result is Success")
                                     else 
                                        print("result is Failure")
                                    
    

我想处理如果网络断开了怎么办,我想知道响应是否到达。

提前感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

响应验证

默认情况下,无论响应的内容如何,​​Alamofire 都会将任何已完成的请求视为成功。如果响应具有不可接受的状态代码或 MIME 类型,则在响应处理程序之前调用 validate 会导致生成错误。

手动验证

Alamofire.request("https://httpbin.org/get")
    .validate(statusCode: 200..<300)
    .validate(contentType: ["application/json"])
    .responseData  response in
        switch response.result 
        case .success:
            print("Validation Successful")
        case .failure(let error):
            print(error)
        
    

自动验证

自动验证200..&lt;300 范围内的状态码,并且响应的Content-Type 标头与请求的Accept 标头匹配(如果提供了)。

Alamofire.request("https://httpbin.org/get").validate().responseJSON  response in
    switch response.result 
    case .success:
        print("Validation Successful")
    case .failure(let error):
        print(error)
    


统计指标

时间线 Alamofire 在 Request 的整个生命周期中收集计时,并创建一个 Timeline 对象,作为所有响应类型的属性公开。

Alamofire.request("https://httpbin.org/get").responseJSON  response in
    print(response.timeline)

以上报告如下Timeline信息:

Latency:0.428 秒 Request Duration:0.428 秒 Serialization Duration:0.001 秒 Total Duration:0.429 秒

取自Alamofire Usage。你可以有更深入的了解。

【讨论】:

我试图澄清我的问题。对不起,如果我不清楚。 如果请求失败或没有连接请求将失败,在case .failure 你会发现错误是什么。【参考方案2】:

您可以只使用标准闭包,它会给您一个响应。无论响应是否为错误,都会调用此闭包。如果您想检查上传进度,它也可以这样做

Alamofire.download("https://httpbin.org/image/png")
    .downloadProgress  progress in // progress
        print("Download Progress: \(progress.fractionCompleted)")
    
    .responseData  response in // usual place to get response
        if let data = response.result.value 
            let image = UIImage(data: data)
        
    

阅读Making a request documentation了解更多信息

【讨论】:

我试图澄清我的问题。对不起,如果我不清楚。 如果没有网络,则请求将失败,您可能会收到无连接错误或超时错误

以上是关于我如何检查 Alamofire 我的请求已发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何记录 HTTP POST 请求

如何使用 Alamofire 重试请求?

Alamofire 编码无效URL

Alamofire 多个请求

如何检查网络响应来自 Alamofire 请求中的缓存或服务器?

Alamofire 4.3 无法发送 JSON 请求