스위프트 알라모파이어: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)
}
아니면 당신이 그것을 필요로 한다면.response
value 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
'programing' 카테고리의 다른 글
HikariPool-1 - 연결을 사용할 수 없습니다. 매우 작은 로드 서버의 경우 요청이 30000ms 이후에 시간 초과되었습니다. (0) | 2023.09.04 |
---|---|
최고의 다중 파일 JavaScript/Flash 파일 업로더는 무엇입니까? (0) | 2023.09.04 |
Efcore: MaxAsync를 수행할 때 시퀀스에 요소가 없습니다. (0) | 2023.09.04 |
발견되지 않은 구문 오류: 'Document'에서 'querySelector'를 실행하지 못했습니다. (0) | 2023.09.04 |
팬더 데이터 프레임에서 열 이동 (0) | 2023.09.04 |