如何检查 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案例.