首页 > 解决方案 > 来自 API 的 JSON 身份验证验证

问题描述

我刚刚发现了这个网站,在我构建我的 api 之前,我正在测试如何在 Swift 上实现它。该网站为成功登录提供 POST 响应,这些是有效凭据:

{
    "email": "eve.holt@reqres.in",
    "password": "cityslicka"
}

是 API 的url

似乎实际的登录名和用户名隐藏在那里。如何快速实现一个代码,告诉我好的,这些凭据是正确的,否则返回负数?什么是最简单和安全的方法?

请对代码发表一些评论,我真的需要学习,不仅要这样做,因为我会在我的应用程序上使用 api 做很多工作。

这是我的起点,我知道我必须创建一个模型:

struct UserAuthJSONDataModel: Identifiable, Decodable {
    var email: String
    var password: String
}

非常感谢

标签: swift

解决方案


您需要调用 API。目前,它要么返回一个令牌,要么返回一个响应“错误”:“未找到用户”。您可以运行一个简单的 if 来查看令牌是否存在。

因此,当您在浏览器中打开链接时,为了响应您当前的评论,它正在拨打 get 电话。相反,您需要使用正文进行 post 调用。您首先需要的是:

struct UserAuthCall: Codable {
    var email: String?
    var password: String?
}

struct UserAuthResponse: Codable {
    var token: String?
    var error: String?
}

然后你想像这样创建你的对象:

let user = UserAuthCall(email: "email@email.com", password: "password")

接下来我们要拨打电话。我建议您安装 pod Alamofire,因为它非常适合 HTTPS 调用。下面我有一个通用函数,它允许您传递任何正文并返回任何响应并立即对其进行解码。您将来也可以使用它。

func fetch<S: Codable, R: Codable>(_ url:String, send: S, of: R.Type, completion: @escaping (_ value: R) -> Void) {
    AF.request(url, method: .post, parameters: send, encoder: JSONParameterEncoder.default, headers: HTTPHeaders([HTTPHeader(name: "Content-Type", value: "application/json")])).responseDecodable(of: R.self) { (response) in
        guard let value = response.value else {print("issue"); return}
        completion(value)
    }
}

我们将这样调用函数:

fetch("https://reqres.in/api/login", send: user, of: UserAuthResponse.self) { (response) in
     // here we check if the token exists
     if response.token != nil {
         // user exists do whatever you want
     } else {
        // user does not exist try again
     }
}

注意:在文件顶部,您需要指定 import Alamofire

我已经测试并与您的凭据完美配合。不过我要注意的一件事是,API 似乎对密码无动于衷,它只是检查电子邮件是否存在。


推荐阅读