swift - 来自 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
}
非常感谢
解决方案
您需要调用 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 似乎对密码无动于衷,它只是检查电子邮件是否存在。
推荐阅读
- firebase - Vue JS + Firestore - 将计算属性链接到单个文档字段
- javascript - 如何在流程中指定一种“十六进制颜色代码”?
- sustainsys-saml2 - Owin - 使用元数据文件/url 初始化 IdP
- python - 本地测试 (Python) Google Cloud Function 时的应用程序上下文错误
- html - VsVim - vit 和 vat 无法正常工作
- svn - 使用 VisualSVN:我想配置 post-commit.cmd 挂钩以向自己发送电子邮件
- java - WS-Trust 的命名空间问题
- angular - Angular Reactive Form Array,更改检测覆盖表单
- python-3.x - 将文件名添加到 tkinter 中的列表
- php - Htaccess如何从文件中删除尾部斜杠而不是目录