当前位置: 首页 > 知识库问答 >
问题:

Alamofire:网络错误vs无效状态代码?

卫英悟
2023-03-14

使用Alamofire 4/Swift 3,您如何区分由于以下原因而失败的请求:

  1. 网络连接(主机关闭,无法连接到主机)vs

代码

    sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default)
        .validate() //Validate status code
        .responseData { response in

        if response.result.isFailure {
               //??NETWORK ERROR OR INVALID SERVER RESPONSE??
        }
    }

我们希望以不同的方式处理每个案件。在后一种情况下,我们要询问回答。(在前一种情况下,我们不知道,因为没有回应)。

共有3个答案

商冠玉
2023-03-14

自动验证应考虑200...299(成功代码)范围内的状态代码,因此当您获得无效的服务器HTTP响应代码5xx(499意味着客户端关闭请求)时,您可以确保它不依赖于验证。

关于statusCode,我的建议是遵循正确的新规则来获取它。如果您在检索时遇到问题,请查看此答案。

说到网络可达性,你可以写:

let manager = NetworkReachabilityManager(host: "www.apple.com")
manager?.listener = { status in
    print("Network Status Changed: \(status)")
}
manager?.startListening()

在使用网络可达性来确定下一步要做什么时,需要记住一些重要的事情。

  • 不要使用可达性来确定是否应该发送网络请求。你应该一直寄

您也可以在官方的Alamofire 4 GitHUB页面上找到这些详细信息

谯皓君
2023-03-14

Alamofire可以告诉你请求的状态,这个代码对我来说很好:

if let error = response.result.error as? NSError {
    print(error)//print the error description
    if (error.code == -1009){
                    print(error.code) // this will print -1009,somehow it means , there is no internet connection
                    self.errorCode = error.code

    }
      //check for other error.code    

}else{
  //there is no problem
}

错误。代码将告诉您问题所在

宦源
2023-03-14

以下是我们当前的工作解决方案

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default)
    .validate() //Validate status code
    .responseData { response in

    if response.result.isFailure {
        if let error = response.result.error as? AFError, error.responseCode == 499 {
            //INVALID SESSION RESPONSE
        } else {
            //NETWORK FAILURE
        }
    }
}

如果<代码>结果。错误类型为AFError您可以使用responseCode。从AFError源注释中:

/// Returns whether the `AFError` is a response validation error. When `true`, the `acceptableContentTypes`,
/// `responseContentType`, and `responseCode` properties will contain the associated values.
public var isResponseValidationError: Bool {
    if case .responseValidationFailed = self { return true }
    return false
}

也许有更好的方法(?)但这似乎奏效了。。。

 类似资料:
  • 我通过Spring Webflux框架使用Reactor Netty,以便将数据发送到远程内容交付网络。当客户端请求完成时,默认的反应器Netty行为是保持连接活动并将其释放回底层连接池。 一些内容交付网络建议在某些类型的状态代码(例如500个内部服务器错误)上重新解析DNS。为了实现这一点,我添加了一个自定义的Netty和,但我也需要关闭连接,否则它将被释放回池中,并且不会重新解析DNS。 如何

  • jd.getNetworkType(OBJECT) 获取网络类型。 OBJECT 参数说明: 参数 类型 必填 说明 success Function 是 接口调用成功的回调 fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) success 回调参数说明: 参数 说明 networkType 网络类型

  • 我使用axios与自己的API(不是用NodeJS编写的)通信。 当我发布一个非简单的请求时,axios总是直接转到控制台中显示网络错误的catch块,即使有2个成功的Http请求。 错误:网络错误堆栈跟踪:createerror@http://localhost:3000/statist/js/bundle.js:1634:15 handleerror@http://localhost:3000

  • 问题内容: 像这样的代码: 问题答案: 不适用于我。最好在 Alamofire中 使用这样的代码:

  • 我试图使用回调将验证输入。 当我试图在文本框中输入时,我遇到了下面的错误。有人能帮我解释一下为什么我会犯这个错误,以及我如何纠正它吗。 不允许回调吗?我错过了什么? 未捕获错误:对象作为React子对象无效(找到:具有键{dispatchConfig、_TargetList、nativeEvent、type、target、currentTarget、eventPhase、bubbles、cance