programing

스위프트 알라모파이어:HTTP 응답 상태 코드를 가져오는 방법

bestprogram 2023. 9. 4. 20:30

스위프트 알라모파이어:HTTP 응답 상태 코드를 가져오는 방법

요청 실패에 대한 HTTP 응답 상태 코드(예: 400, 401, 403, 503 등)를 검색하고 싶습니다.이 코드에서 나는 HTTP Basic으로 사용자 인증을 수행하고 있으며 사용자가 암호를 잘못 입력했을 때 인증에 실패했다는 메시지를 사용자에게 전달할 수 있기를 원합니다.

Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
    .responseString { (req, res, data, error) in
        if error != nil {
            println("STRING Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for String")
}
    .responseJSON { (req, res, data, error) in
        if error != nil {
            println("JSON Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for JSON")
}

안타깝게도 생성된 오류는 HTTP 상태 코드 409가 실제로 수신되었음을 나타내지 않는 것 같습니다.

STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:nil

또한 오류가 발생했을 때 HTTP 본문을 검색하면 좋을 것입니다. 왜냐하면 나의 서버 측에서 오류에 대한 텍스트 설명을 거기에 넣을 것이기 때문입니다.

문의사항
2xx가 아닌 응답 시 상태 코드를 검색할 수 있습니까?
2xx 응답 시 특정 상태 코드를 검색할 수 있습니까?
2xx가 아닌 응답 시 HTTP 본문을 검색할 수 있습니까?

감사합니다!

Alamofire > = 4.0 / Alamofire > = 5.0인 Swift 3.x / Swift 4.0 사용자의 경우


response.response?.statusCode

자세한 예:

Alamofire.request(urlString)
        .responseString { response in
            print("Success: \(response.result.isSuccess)")
            print("Response String: \(response.result.value)")

            var statusCode = response.response?.statusCode
            if let error = response.result.error as? AFError {  
                statusCode = error._code // statusCode private                 
                switch error {
                case .invalidURL(let url):
                    print("Invalid URL: \(url) - \(error.localizedDescription)")
                case .parameterEncodingFailed(let reason):
                    print("Parameter encoding failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                case .multipartEncodingFailed(let reason):
                    print("Multipart encoding failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                case .responseValidationFailed(let reason):
                    print("Response validation failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")

                    switch reason {
                    case .dataFileNil, .dataFileReadFailed:
                        print("Downloaded file could not be read")
                    case .missingContentType(let acceptableContentTypes):
                        print("Content Type Missing: \(acceptableContentTypes)")
                    case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
                        print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
                    case .unacceptableStatusCode(let code):
                        print("Response status code was unacceptable: \(code)")
                        statusCode = code
                    }
                case .responseSerializationFailed(let reason):
                    print("Response serialization failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                    // statusCode = 3840 ???? maybe..
                default:break
                }

                print("Underlying error: \(error.underlyingError)")
            } else if let error = response.result.error as? URLError {
                print("URLError occurred: \(error)")
            } else {
                print("Unknown error: \(response.result.error)")
            }

            print(statusCode) // the status code
    } 

(Alamofire 4에는 완전히 새로운 오류 시스템이 포함되어 있습니다. 자세한 내용은 여기를 참조하십시오.)

Alamofire >= 3.0을 사용하는 Swift 2.x 사용자의 경우

Alamofire.request(.GET, urlString)
      .responseString { response in
             print("Success: \(response.result.isSuccess)")
             print("Response String: \(response.result.value)")
             if let alamoError = response.result.error {
               let alamoCode = alamoError.code
               let statusCode = (response.response?.statusCode)!
             } else { //no errors
               let statusCode = (response.response?.statusCode)! //example : 200
             }
}

완료 핸들러에 인수가 있는 경우response아래에 http 상태 코드가 있습니다.response.response.statusCode:

Alamofire.request(.POST, urlString, parameters: parameters)
            .responseJSON(completionHandler: {response in
                switch(response.result) {
                case .Success(let JSON):
                    // Yeah! Hand response
                case .Failure(let error):
                   let message : String
                   if let httpStatusCode = response.response?.statusCode {
                      switch(httpStatusCode) {
                      case 400:
                          message = "Username or password not provided."
                      case 401:
                          message = "Incorrect password for user '\(name)'."
                       ...
                      }
                   } else {
                      message = error.localizedDescription
                   }
                   // display alert with error message
                 }
    Alamofire
        .request(.GET, "REQUEST_URL", parameters: parms, headers: headers)
        .validate(statusCode: 200..<300)
        .responseJSON{ response in

            switch response.result{
            case .Success:
                if let JSON = response.result.value
                {
                }
            case .Failure(let error):
    }

라모 화재를 사용하여 상태 코드를 가져오는 가장 좋은 방법입니다.

Alamofire.request(URL).responseJ아들 {에 대한 반응.
상태 = response.response?를 허용합니다.상태 코드print("STATUS \(상태))"
}

또는 패턴 일치 사용

if let error = response.result.error as? AFError {
   if case .responseValidationFailed(.unacceptableStatusCode(let code)) = error {
       print(code)
   }
}

다음 코드에서 상태 코드 핸들러를 확인할 수 있습니다.

    let request = URLRequest(url: URL(string:"url string")!)    
    Alamofire.request(request).validate(statusCode: 200..<300).responseJSON { (response) in
        switch response.result {
        case .success(let data as [String:Any]):
            completion(true,data)
        case .failure(let err):
            print(err.localizedDescription)
            completion(false,err)
        default:
            completion(false,nil)
        }
    }

상태 코드가 유효하지 않으면 스위치 케이스에 오류를 입력합니다.

당신의responseJSON완료, 응답 객체에서 상태 코드를 가져올 수 있습니다. 응답 객체의 유형은 다음과 같습니다.NSHTTPURLResponse?:

if let response = res {
    var statusCode = response.statusCode
}

이는 상태 코드가 오류 범위에 있는지 여부에 관계없이 작동합니다.자세한 내용은 NSHTTPURL 응답 문서를 참조하십시오.

다른 질문은 다음을 사용할 수 있습니다.responseString원시 응답 본문을 가져오는 함수입니다.추가로 추가할 수 있습니다.responseJSON둘 다 호출될 겁니다

.responseJson { (req, res, json, error) in
   // existing code
}
.responseString { (_, _, body, _) in
   // body is a String? containing the response body
}

오류는 어떤 이유로 작업이 취소되고 있음을 나타냅니다.그 이유를 이해하기 위해서는 더 많은 세부사항이 필요합니다.하지만 내 생각에 더 큰 문제는 당신의 엔드포인트가https://host.com/a/path 보고할 이 없기 가입다니가 됩니다. 보고에 대한 실제 서버 응답이 없습니다. 그래서 당신은 보고 있습니다.nil.

응답을 한 끝점을 이 표시됩니다.res(언급한 하여) a 태의형의 NSURLHTTPResponse 속가개체와 같은 객체statusCode 타기.

그리고 확실히 하자면,error이 형의입니다.NSError네트워크 요청이 실패한 이유를 알려줍니다.서버 측 실패의 상태 코드는 실제로 응답의 일부입니다.

그것이 당신의 주요 질문에 대답하는 데 도움이 되기를 바랍니다.

저는 실제 에러 코드 번호를 얻는 방법을 알아야 했습니다.

는 다른 를 A에서 받아야 했습니다..catch그들이 이전에 Alamofire에 대해 설정한 조항:

} .catch { (error) in

    guard let error = error as? AFError else { return }
    guard let statusCode = error.responseCode else { return }

    print("Alamofire statusCode num is: ", statusCode)
}

아니면 당신이 그것을 필요로 한다면.responsevalue follow @mbryzinski의 대답

Alamofire ... { (response) in

    guard let error = response.result.error as? AFError else { return }
    guard let statusCode = error.responseCode else { return }

    print("Alamofire statusCode num is: ", statusCode)
})

Alamofire > 2.0을 사용하는 Swift 2.0 사용자의 경우

Alamofire.request(.GET, url)
  .responseString { _, response, result in
    if response?.statusCode == 200{
      //Do something with result
    }
}

Alamofire >= 5.0을 사용하는 Swift 3.x / Swift 4.0 / Swift 5.0 사용자의 경우

요청 수정자를 사용하여 시간 초과 간격을 늘리거나 줄입니다.

Alamofire의 요청 생성 방법은 사용자 지정에 가장 일반적인 매개 변수를 제공하지만 때로는 이러한 매개 변수로도 충분하지 않습니다.전달된 값에서 생성된 URLRequests는 요청을 생성할 때 RequestModifier 폐쇄를 사용하여 수정할 수 있습니다.예를 들어 URLRequest의 시간 초과를 설정하려면120초 간격으로 종료 시 요청을 수정합니다.

var manager = Session.default
 manager.request(urlString, method: method, parameters: dict, headers: headers, requestModifier: { $0.timeoutInterval = 120 }).validate().responseJSON { response in

OR

RequestModifier는 후행 폐쇄 구문에서도 작동합니다.

var manager = Session.default
     manager.request("https://httpbin.org/get") { urlRequest in
    urlRequest.timeoutInterval = 60
    urlRequest.allowsConstrainedNetworkAccess = false
}
.response(...)
    AF.request(url, method: .get).responseDecodable(of: Weather.self) { response in
        switch response.result {
        case .success(let data):
            print(data)
            var statusCode = response.response?.statusCode
            
            if statusCode == 200 {
                print(response)
            }
        case .failure(let error):
            print(error)
        }
    }

언급URL : https://stackoverflow.com/questions/29131253/swift-alamofire-how-to-get-the-http-response-status-code