当前位置:  开发笔记 > 前端 > 正文

Alamofire返回错误HTTP状态代码的.Success

如何解决《Alamofire返回错误HTTP状态代码的.Success》经验,为你挑选了3个好方法。

我有一个非常简单的场景,我正在努力.我正在使用Alamofire在rest API上注册用户.第一次注册调用成功,用户可以登录.第二次调用,当尝试使用相同的电子邮件地址注册时,应该从服务器生成HTTP状态代码409.但是,Alamofire会返回一个带有空请求和响应的.Success.我用postman测试了这个API,它正确返回409.

为什么Alamofire没有返回.Failure(错误),错误有状态代码信息等?

这是我每次使用相同输入运行的调用.

Alamofire.request(.POST, "http://localhost:8883/api/0.1/parent", parameters: registrationModel.getParentCandidateDictionary(), encoding: .JSON).response(completionHandler: { (req, res, d, e) -> Void in
        print(req, res, d, e)
    })

David Berry.. 67

来自Alamofire 手册:

验证

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

您可以validate再次使用手动手动验证状态代码:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
     .validate(statusCode: 200..<300)
     .validate(contentType: ["application/json"])
     .response { response in
         print(response)
     }

或者,您可以使用不validate带参数半自动验证状态代码和内容类型:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
     .validate()
     .responseJSON { response in
         switch response.result {
         case .success:
             print("Validation Successful")
         case .failure(let error):
             print(error)
         }
     }


Rob.. 14

如果使用response,您可以检查NSHTTPURLResponse参数:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
    .response { response in
        if response.response?.statusCode == 409 {
            // handle as appropriate
        }
}

默认情况下,4xx状态代码不会被视为错误,但您可以validate将其视为此类错误,然后将其折叠为更广泛的错误处理:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
    .validate()
    .response() { response in
        guard response.error == nil else {
            // handle error (including validate error) here, e.g.

            if response.response?.statusCode == 409 {
                // handle 409 here
            }
            return
        }
        // handle success here
}

或者,如果使用responseJSON:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
.validate()
.responseJSON() { response in
    switch response.result {
    case .failure:
        // handle errors (including `validate` errors) here

        if let statusCode = response.response?.statusCode {
            if statusCode == 409 {
                // handle 409 specific error here, if you want
            }
        }
    case .success(let value):
        // handle success here
        print(value)
    }
}

以上是Alamofire 4.x. 请参阅此前对Alamofire早期版本的回答.



1> David Berry..:

来自Alamofire 手册:

验证

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

您可以validate再次使用手动手动验证状态代码:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
     .validate(statusCode: 200..<300)
     .validate(contentType: ["application/json"])
     .response { response in
         print(response)
     }

或者,您可以使用不validate带参数半自动验证状态代码和内容类型:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
     .validate()
     .responseJSON { response in
         switch response.result {
         case .success:
             print("Validation Successful")
         case .failure(let error):
             print(error)
         }
     }



2> Rob..:

如果使用response,您可以检查NSHTTPURLResponse参数:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
    .response { response in
        if response.response?.statusCode == 409 {
            // handle as appropriate
        }
}

默认情况下,4xx状态代码不会被视为错误,但您可以validate将其视为此类错误,然后将其折叠为更广泛的错误处理:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
    .validate()
    .response() { response in
        guard response.error == nil else {
            // handle error (including validate error) here, e.g.

            if response.response?.statusCode == 409 {
                // handle 409 here
            }
            return
        }
        // handle success here
}

或者,如果使用responseJSON:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
.validate()
.responseJSON() { response in
    switch response.result {
    case .failure:
        // handle errors (including `validate` errors) here

        if let statusCode = response.response?.statusCode {
            if statusCode == 409 {
                // handle 409 specific error here, if you want
            }
        }
    case .success(let value):
        // handle success here
        print(value)
    }
}

以上是Alamofire 4.x. 请参阅此前对Alamofire早期版本的回答.


行``if statusCode == 409 {//在这里处理409特定错误,如果你想要的话`` - 从服务器端检索错误消息的最佳方法是什么?例如,返回错误401和服务器通知用户登录凭证不正确.什么是最佳做法?

3> Lilo..:

如果使用validate(),则将从服务器中释放错误消息,如果要保留它,请参见以下答案/sf/ask/17360801/

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有