如何使用alamofire httpstatuscode
我想要在httpstatuscode
Server返回
if statusCode == 200
resonseBody
{id: number}
if statusCode 400..<500
resonseBody
{
code: String
timestamp: String
message: String
}
上可以进行的差异响应,所以现在我的代码是
AF.request(url, method: .post, headers: header).responseData { response in
switch response.result {
case .success(let data) :
guard let response = response.response else {return}
let json = try? JSONSerialization.jsonObject(with: data)
switch response.statusCode {
case 200:
if let json = json as? [String: Any] , let message = json["id"] as? Int{print(message)}
case (400..<500):
if let json = json as? [String: Any] , let message = json["message"] as? String{print(message)}
default:
return
}
case .failure(let err) :
print(err)
}
}
尝试使用此代码转换响应的响应,
struct a: Codable {var id: Int}
struct b: Codable{
var code: String
var timestamp: String
var message: String
}
AF.request(url, method: .post, headers: header).responseDecodable(of: a.self) { response in
guard let data = response.value else {return}
print(data)
}
.responseDecodable(of: b.self) { response in
guard let data = response.value else {return}
print(data)
}
但是这种方式,无论状态密码返回A和B,
我都想要 StautScode == 200返回A或 状态密码400 ..&lt; 500返回b
我该怎么办?
I want a diffrerent responseDecodable on the httpStatusCode
server return
if statusCode == 200
resonseBody
{id: number}
if statusCode 400..<500
resonseBody
{
code: String
timestamp: String
message: String
}
so now my code is
AF.request(url, method: .post, headers: header).responseData { response in
switch response.result {
case .success(let data) :
guard let response = response.response else {return}
let json = try? JSONSerialization.jsonObject(with: data)
switch response.statusCode {
case 200:
if let json = json as? [String: Any] , let message = json["id"] as? Int{print(message)}
case (400..<500):
if let json = json as? [String: Any] , let message = json["message"] as? String{print(message)}
default:
return
}
case .failure(let err) :
print(err)
}
}
I try this code convert responseDecodable
struct a: Codable {var id: Int}
struct b: Codable{
var code: String
var timestamp: String
var message: String
}
AF.request(url, method: .post, headers: header).responseDecodable(of: a.self) { response in
guard let data = response.value else {return}
print(data)
}
.responseDecodable(of: b.self) { response in
guard let data = response.value else {return}
print(data)
}
but this way Regardless statusCode return both a and b
I want
stautsCode == 200 return a or
statusCode 400..<500 return b
What should I Do?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Afaik,Alamofire没有“为成功的一个对象解码一个对象,而另一个为失败”实现。您必须自己做。
如果您真的想要一个不同的对象来响应2xx响应,而对于4xx响应,则有几种方法:
使用
validate
处理2xx响应,并在错误处理程序中手动解码4xx响应。如果愿意,可以将自己的
wenderserializer
写入2xx和4xx响应的方式不同:在
令代码:字符串
令时间戳:字符串
让消息:字符串
}
最终类apirepsesserializer&lt; t:可解码&gt;:wendesserializer {
懒惰的var decoder = jsondecoder()
私人懒惰var successerializer = decodableResponseserializer&lt; t&gt;(解码器:解码器)
私有懒惰的var ryrorSerializer =解码器处理器&lt; apierRorresponse&gt;(解码器:解码器)
public func序列化(请求:urlrequest?,响应:httpurlresponse?,data:data?error:错误:错误?) t {
如果让错误=错误{投掷错误}
Guard Response =响应else {投掷Urlerror(.badserverresponse)}}
切换响应。STATUSCODE{
案例400 ..&lt; 500:
令apierRobject =尝试errorSerializer.Serialize(请求:请求,响应:响应,数据:数据,错误:nil)
投掷apierRorobject
默认:
返回尝试Successerializer.Serialize(请求:请求,响应:响应,数据:数据,错误:nil)
}
}
}
然后您可以做:
我发现解析的错误对象的嵌套有点乏味,但是它确实将2xx vs 4xx逻辑抽象为
响应>响应
/wendersedecdecoder
完成处理程序。在这两种情况下,我都将所有2xx响应视为成功,不仅是200个。有些服务器返回2xx代码,而不是200个代码。
AFAIK, Alamofire does not have a “decode one object for success and another for failure” implementation. You'll have to do this yourself.
If you really want a one distinct object for 2xx responses and another for 4xx responses, there are a few approaches:
Use
validate
to handle the 2xx responses, and manually decode 4xx responses in the error handler.If you want, you could write your own
ResponseSerializer
to parse 2xx and 4xx responses differently:And then you can do:
I find the nesting of the parsed error object to be a little tedious, but it does abstract the 2xx vs 4xx logic out of the
response
/responseDecoder
completion handler.In both of these, I'm considering all 2xx responses as success, not just 200. Some servers return 2xx codes other than just 200.