Swift Alamofire响应状态码

3

我该如何从Alamofire的response中获取状态码?

在最新版本中,我可以使用validate,但我需要检查状态码是什么。

代码:

Alamofire.request(.GET, "http://example.com/url")
         .responseJSON { response in

         }

http://stackoverflow.com/a/33192390/3405387 - Lukas
1
尝试使用 response.response.statusCode - Adam
这个可以用,看起来不太好,但是它能工作 :) - Mirza Delic
4个回答

5

在@MirzaDelic指出我的错误后,这个代码可以正常工作:

Alamofire.request(.get, "http://www.google.com")
    .responseJSON { response in
        if response.response.statusCode == 404 {
            // do something
        } else {
            // do something else
        }
}

不起作用,但这个可以:response.response.statusCode - Mirza Delic
啊,好的。非常抱歉。 - damianesteban

1
使用 Alamofire 5.6 版本,如果你在 AF 请求中添加 .validate(statusCode: [200]),那么你可以检查结果的 AFError
func request(_ requestConvertible: any URLRequestConvertible) async throws {
    switch await AF
        .request(requestConvertible, interceptor: interceptor)
        .validate(statusCode: [200])
        .serializingDecodable(Empty.self, emptyResponseCodes: [200])
        .result {
    case .failure(let error):
        if error.responseCode == 401 {
            // Handle 401 statusCode
        }
        throw error
    case .success:
        break
    }
}

或者对于一个可解码类型(来自JSON响应):

func requestDecodable<Value: Decodable>(_ requestConvertible: any URLRequestConvertible, to type: Value.Type) async throws -> Value {
    let request = AF.request(requestConvertible, interceptor: interceptor)
        .validate(statusCode: [200])
    let response = request.serializingData(emptyResponseCodes: [200])
    let result = await response.result
    switch result {
    case .failure(let error):
        if request.response?.statusCode == 401 {
            // Handle 401 statusCode
        }
        throw error
    case .success(let data):
        return try JSONDecoder().decode(type.self, from: data)
    }
}

1
虽然上述方法可行,但有更高效的方法来实现。 response.response.statusCode 返回一个可能变化很大的状态码。Alamofire 包括两个对于此情况非常有用的函数,isSuccessisFailure
Alamofire.request(.get, "http://example.com/url").responseJSON { response in
    let responseErrorCode = response.response!.statusCode

    if response.result.isSuccess {
         print("Successful HTTP code: \(responseErrorCode)")

         // Run code if request is successful

    } else if response.result.isFailure {
         print("Failure HTTP code: \(responseErrorCode)")

         // Run code if request isn't successful

    }
}

通过使用上述代码,您可以轻松地了解HTTP代码是好还是坏。

1
在 Alamofire 4.0 swift3 分支中,我需要确切的内容如下:
Alamofire.request(request, withMethod: .get, parameters: parameters, encoding: .url, headers: nil)
        .validate()
        .responseJSON { response in
            switch response.result {
            case .success:
                let statusCode = (response.response?.statusCode)!
                print("...HTTP code: \(statusCode)")
            }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接