responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

时间:2020-07-22 10:55:10

标签: swift api alamofire

我有一个带post方法的API,下面是它的代码

func addScheduleService() {
      let parameter = ["start_time":"06:00","end_time":"09:00","schedule_date":"07/23/2020","schedule_id":"0"]
                      
                      print("parameter is",parameter)
        
       let header: HTTPHeaders = ["Content-Type":"application/json","x-token": self.token!]

 AF.request(mainURL+URLS.addschedule.rawValue, method: .post, parameters: parameter, encoding: JSONEncoding.default, headers: header)
        .responseJSON {
            response in
            switch response.result {
            case .success(let json):
                print("value is",json)
            case .failure(let error):
                print("error is",error)}
            }
        }

邮递员的回复如下:

enter image description here

代码的输出为responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

可能是什么错误?

2 个答案:

答案 0 :(得分:0)

.inputDataNilOrZeroLength表示您收到的空响应没有204或205响应代码,因此Alamofire认为该响应无效(空主体仅对204或205响应有效)。如果期望如此,则需要将期望的状态代码添加到responseDecodable中可接受的空响应代码列表中:

AF.request(...).responseDecodable(of: YourType.self,
                                  emptyResponseCodes: [200, 204, 205]) { response in

}

答案 1 :(得分:0)

也许你可以看看这个答案 -> GitHub Alamofire-responseSerializationFailed

看起来服务器响应的正文是空的,因此 Alamofire 将按原样接收它。

Alamofire 会处理结果 code,并且会找到 200,但是它的主体是空的。对于空响应,可能不被视为有效。

如果您可以在服务器端采取行动,请选择 1。

1 - 将服务器响应更改为正确的 204 - 空

2 - 创建您自己的 DataResponseSerializer:

let dataResponseSerializer = DataResponseSerializer(emptyResponseCodes: [200, 204, 205]) // Default is [204, 205]
manager.upload(multipartFormData: { multipartFormData in
        /// ...
    }, usingThreshold: UInt64.init(), to: ep.s3.virginiaBucketUrl, method: .post, headers: headers)
    .response(responseSerializer: dataResponseSerializer) { response in
        switch response.result {
            case .failure(let error):
                // ...
            case .success(let value):
                // ...
        }
    }