如何检查 API return 是否与 Alamofire 无关?
How to check if the API return nothing with Alamofire?
我正在使用 Alamofire 发出 API 请求以将用户数据插入我的数据库,如果用户电子邮件存在,响应将 return
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 27
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:39:05 GMT
Keep-Alive: timeout=5, max=99
Server: Apache/2.4.25 (Debian)
[Body]:
Email address already exist
[Network Duration]: 0.013917088508605957s
[Serialization Duration]: 0.0s
[Result]: success(Optional(27 bytes))
如果用户邮箱不存在,它会向数据库中插入数据,return 不是这样的
(字面上什么都没有,没有字符或任何东西,如果我在网络浏览器中打开 api 只是一个空白页面)
这是回复
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:54:43 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.25 (Debian)
[Body]: None
[Network Duration]: 0.8882529735565186s
[Serialization Duration]: 0.0s
[Result]: success(nil)
现在我想通过检查响应正文来验证用户电子邮件是否存在。如果响应正文是 Email address already exist,则会显示错误提示。如果响应正文是 None,它将显示成功警报。我的问题是,如何检查响应正文是否为 None?这是验证码
let parameters = ["USERNAME": "\(USERNAME)", "EMAIL": "\(EMAIL)", "FULL_NAME": "\(FULL_NAME)", "NO_TELEPON": "\(NO_TELEPON)", "PASSWORD": "\(PASSWORD)", "USER_TOKEN": "\(USER_TOKEN)"]
AF.request("http://172.16.5.56:8081/User/InsertNewUser", parameters: parameters).response{ response in
debugPrint(response)
if let data = response.data, let utf8Text = String(data: data, encoding: .utf8){
print(utf8Text)
postResponse = utf8Text
if postResponse == "Email address already exist" {
self.haptics.notificationOccurred(.error)
self.activeAlert = .first
self.showAlert = true
}else if postResponse == "None"{ // This is not working
self.haptics.notificationOccurred(.success)
self.activeAlert = .second
self.showAlert = true
}
}
}
失败类型的响应(如您所分享的)是:
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:54:43 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.25 (Debian)
[Body]: None
[Network Duration]: 0.8882529735565186s
[Serialization Duration]: 0.0s
[Result]: success(nil)
显示 [Result]: success(nil)
,这意味着 response.data
字面意思是 nil
。
我提出以下解决方案:
Alamofire
.request("http://172.16.5.56:8081/User/InsertNewUser")
.response { (response) in
if let data = response.data,
let string = String(data: data, encoding: .utf8) {
if string == "Email address already exist" {
self.haptics.notificationOccurred(.error)
self.activeAlert = .first
self.showAlert = true
}
//else if ... {
//handle other cases
//}
} else {
self.haptics.notificationOccurred(.success)
self.activeAlert = .second
self.showAlert = true
}
}
注意:除非不可避免,否则我建议不要直接比较字符串。
至少就一个通用的回复模板达成一致,并确保回复不会出现打字错误或愚蠢的错误。
@staticVoidMan 已经为您当前的后端设置提供了解决方案。但是,如果您将后端更新为 return 更合适的响应,Alamofire 可以自动为您做更多事情。
简而言之,您需要让您的后端按照 JSON API 最佳实践以标准方式运行。其中包括:
- 在失败的情况下,return 失败状态代码(可能是 403)和描述错误的 JSON 有效负载。
- 在成功的情况下,您可以 return 一个 201,这表明新用户已经创建,在这种情况下您应该在响应中包含新用户对象 JSON,或者204,这是空响应的正确状态代码。
在这些情况下,您可以定义适当的 Decodable
Alamofire 可以为您解析的有效负载,以及适当的空响应值,Alamofire 将确保它在 204 中被 returned案例.
我正在使用 Alamofire 发出 API 请求以将用户数据插入我的数据库,如果用户电子邮件存在,响应将 return
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 27
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:39:05 GMT
Keep-Alive: timeout=5, max=99
Server: Apache/2.4.25 (Debian)
[Body]:
Email address already exist
[Network Duration]: 0.013917088508605957s
[Serialization Duration]: 0.0s
[Result]: success(Optional(27 bytes))
这是回复
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:54:43 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.25 (Debian)
[Body]: None
[Network Duration]: 0.8882529735565186s
[Serialization Duration]: 0.0s
[Result]: success(nil)
现在我想通过检查响应正文来验证用户电子邮件是否存在。如果响应正文是 Email address already exist,则会显示错误提示。如果响应正文是 None,它将显示成功警报。我的问题是,如何检查响应正文是否为 None?这是验证码
let parameters = ["USERNAME": "\(USERNAME)", "EMAIL": "\(EMAIL)", "FULL_NAME": "\(FULL_NAME)", "NO_TELEPON": "\(NO_TELEPON)", "PASSWORD": "\(PASSWORD)", "USER_TOKEN": "\(USER_TOKEN)"]
AF.request("http://172.16.5.56:8081/User/InsertNewUser", parameters: parameters).response{ response in
debugPrint(response)
if let data = response.data, let utf8Text = String(data: data, encoding: .utf8){
print(utf8Text)
postResponse = utf8Text
if postResponse == "Email address already exist" {
self.haptics.notificationOccurred(.error)
self.activeAlert = .first
self.showAlert = true
}else if postResponse == "None"{ // This is not working
self.haptics.notificationOccurred(.success)
self.activeAlert = .second
self.showAlert = true
}
}
}
失败类型的响应(如您所分享的)是:
[Response]:
[Status Code]: 200
[Headers]:
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Thu, 22 Apr 2021 06:54:43 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.25 (Debian)
[Body]: None
[Network Duration]: 0.8882529735565186s
[Serialization Duration]: 0.0s
[Result]: success(nil)
显示 [Result]: success(nil)
,这意味着 response.data
字面意思是 nil
。
我提出以下解决方案:
Alamofire
.request("http://172.16.5.56:8081/User/InsertNewUser")
.response { (response) in
if let data = response.data,
let string = String(data: data, encoding: .utf8) {
if string == "Email address already exist" {
self.haptics.notificationOccurred(.error)
self.activeAlert = .first
self.showAlert = true
}
//else if ... {
//handle other cases
//}
} else {
self.haptics.notificationOccurred(.success)
self.activeAlert = .second
self.showAlert = true
}
}
注意:除非不可避免,否则我建议不要直接比较字符串。
至少就一个通用的回复模板达成一致,并确保回复不会出现打字错误或愚蠢的错误。
@staticVoidMan 已经为您当前的后端设置提供了解决方案。但是,如果您将后端更新为 return 更合适的响应,Alamofire 可以自动为您做更多事情。
简而言之,您需要让您的后端按照 JSON API 最佳实践以标准方式运行。其中包括:
- 在失败的情况下,return 失败状态代码(可能是 403)和描述错误的 JSON 有效负载。
- 在成功的情况下,您可以 return 一个 201,这表明新用户已经创建,在这种情况下您应该在响应中包含新用户对象 JSON,或者204,这是空响应的正确状态代码。
在这些情况下,您可以定义适当的 Decodable
Alamofire 可以为您解析的有效负载,以及适当的空响应值,Alamofire 将确保它在 204 中被 returned案例.