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

时间:2016-01-12 07:15:47

标签: ios swift alamofire

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

4 个答案:

答案 0 :(得分:61)

来自Alamofire manual

  

验证

     

默认情况下,Alamofire会将任何已完成的请求视为成功,   无论回复的内容如何。在之前调用验证   响应处理程序会在响应有效时生成错误   不可接受的状态代码或MIME类型。

您可以再次使用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)
         }
     }

答案 1 :(得分:13)

如果使用@foreach ($days as $day) <label>{{$day['day']}}</label> {!! Form::text("day_of_wk[{$day['dow']}].start_time", null, ['class' => 'form-control'])!!} @endforeach ,您可以查看response参数:

NSHTTPURLResponse

默认情况下,4xx状态代码不会被视为错误,但您可以使用Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default) .response { response in if response.response?.statusCode == 409 { // handle as appropriate } } 将其视为此类错误,然后将其折叠为更广泛的错误处理:

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 4.x.请参阅以前针对earlier versions of Alamofire的此答案的再现。

答案 2 :(得分:5)

如果您使用validate(),那么您将从服务器中删除错误消息,如果您想保留它,请参阅此答案https://stackoverflow.com/a/36333378/1261547

答案 3 :(得分:0)

这是我的AlamoFire错误捕获代码:

switch response.result {
                case .success(let value):
                    completion(.success(value))
                case .failure(var error):

                    var errorString: String?

                    if let data = response.data {
                        if let json = try? (JSONSerialization.jsonObject(with: data, options: []) as! [String: String]) {
                            errorString = json["error"]

                        }
                    }
                    let error = MyError(str: errorString!)
                    let x = error as Error
                    print(x.localizedDescription)
                    completion(.failure(x))

                }

和MyError类的定义:

class MyError: NSObject, LocalizedError {
        var desc = ""
        init(str: String) {
            desc = str
        }
        override var description: String {
            get {
                return "MyError: \(desc)"
            }
        }
        //You need to implement `errorDescription`, not `localizedDescription`.
        var errorDescription: String? {
            get {
                return self.description
            }
        }
    }