响应序列化失败(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

3
我有一个带有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)}
            }
        }

在 Postman 中的响应如下: enter image description here 代码输出的错误为 responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
可能出现了什么错误?

你试过用在Postman中写的相同的头部/主体参数吗?例如,end_time参数是不同的。还可以尝试使用.responseData而不是.responseJSON - undefined
你是指参数的顺序吗? - undefined
不,截图中是 "end_time":"10:00",但代码中是 "end_time":"09:00"。对于您的请求应该返回无效的 JSON 响应(空白、错误消息等)。因此,在尝试序列化响应时出现了失败。 - undefined
这只是一个字符串...如何将其序列化呢? - undefined
如果你需要解析一个 JSON,你需要一个有效的 JSON 响应。你试过使用 .responseData 或者 .responseString 而不是我提到的 .responseJSON 吗?同时将响应添加到你的问题中。 - undefined
2个回答

4

.inputDataNilOrZeroLength 表示你收到了一个空响应,但没有收到204或205响应代码,因此Alamofire认为响应无效(空正文仅对204或205响应有效)。如果这是预期的,请将预期状态代码添加到 responseDecodable 的可接受空响应代码列表中。

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

}

好的,我会尝试……但是我没有使用任何模型来完成这个任务。 - undefined
你可以将相同的参数传递给responseJSON,但我建议为你的响应创建一个Decodable类型。 - undefined
响应只有两个值。如何为此API设置可解码的类型? - undefined

1

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

看起来服务器响应体为空,因此Alamofire将接收到它。

Alamofire将寻找结果code,并找到200,但是由于响应体为空,可能不被视为有效。

如果您可以在服务器端进行操作,请选择第一种方法。

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):
                // ...
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接