我有一个带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)}
}
}
邮递员的回复如下:
代码的输出为responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
可能是什么错误?
答案 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):
// ...
}
}