如何将我的登录用户URLSession代码转换为Siesta framework代码?我现在的尝试不起作用。
我在GithubBrowser中看过这个例子,但是我使用的API不是这样工作的。
问题是,用户结构是按我正在使用的API中的端点的工作方式来划分的。终点是http://server.com/api/key。是的,它实际上被称为key而不是userlogin。它被作者称为是因为你发布了一个用户/通行证对,并得到了一个密钥。因此它接受(通过post)一个json结构,如:

{"name": "bob", "password": "s3krit"}

并作为响应返回:
{"token":"AEWasBDasd...AAsdga"}

我有一个结构:
struct SessionUser: Codable
{
    let name: String
    let password: String
    let token: String
}

…为用户封装状态(REST中的“S”)。问题是名称和密码被张贴和令牌是回应。
当此状态更改时,我将执行以下操作:
service.invalidateConfiguration()  // So requests get config change
service.wipeResources()            // Scrub all unauthenticated data

实例存储在单个实例中,该实例由configure块拾取,以便将来自API的令牌放入所有其他API请求的头中:
    configure("**") {
        // This block ^ is run AGAIN when the configuration is invalidated
        // even if loadManifest is not called again.
        if let haveToken = SessionManager.shared.currentUser?.token
        {
            $0.headers["Authorization"] = haveToken
        }
    }

顺便说一下,令牌注入部分已经运行良好。喂,午睡!
URLSession版本
与午睡相比,这有点臃肿,我现在不使用这个,但这里是它过去的样子:
func login(user: SessionUser, endpoint: URL)
{
    DDLogInfo("Logging in: \(user.name) with \(user.password)")

    let json: [String: Any] = ["name": user.name, "password": user.password]
    let jsonData = try? JSONSerialization.data(withJSONObject: json)
    var request = URLRequest(url: endpoint)
    request.httpMethod = "POST"
    request.httpBody = jsonData
    _currentStatus = .Unknown

    weak var welf = self
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else {
            handleLogin(error: error, message: "No data from login attempt")
            return
        }
        let jsonData:Any
        do {
            jsonData = try JSONSerialization.jsonObject(with: data, options: [])
        }
        catch let jsonDecodeError {
            handleLogin(error: jsonDecodeError, message: "Could not get JSON from login response data")
            return
        }
        guard let jsonDecoded = jsonData as? [String: Any] else {
            handleLogin(error: error, message: "Could not decode JSON as dictionary")
            return
        }
        guard let token = jsonDecoded["token"] as? String else {
            handleLogin(error: error, message: "No auth token in login response")
            return
        }
        let newUser = SessionUser(name: user.name, password: "", token: token)
        welf?.currentUser = newUser
        welf?.saveCurrentSession()
        welf?._currentStatus = .LoggedIn
        DDLogInfo("User \(newUser.name) logged in")
        loginUpdate(user: newUser, status: .LoggedIn, message: nil, error: nil)
    }

    task.resume()
}

午睡版
我现在的尝试是:
func login(user: String, pass: String, status: @escaping (String?) -> ())
{
    let json = [ "name": user, "password": pass]
    let req = ManifestCloud.shared.keys.request(.post, json: json)
    req.onSuccess { (tokenInfo) in
        if let token = tokenInfo.jsonDict["token"] as? String
        {
            let newUser = SessionUser(name: user, password: pass, token: token)
            self.currentUser = newUser
        }
        status("success")
    }
    req.onFailure { (error) in
        status(error.userMessage)
    }
    req.onCompletion { (response) in
        status(nil)
    }
}

这有点管用,但Siesta并没有保存登录凭据,我不得不为登录状态安装一个新的通知系统,我希望Siesta能为我做些什么。
我想使用Siesta的缓存,以便SessionUser对象在本地缓存,如果需要,我可以使用它来获取新的令牌,使用缓存的凭据。目前,我有一个陪审团操纵系统使用SessionUser
感谢任何帮助!

最佳答案

这里的基本问题是您请求的是资源,而不是加载资源。Siesta draws a distinction between those two things:第一个基本上是一个虚构的URLSession请求;第二个意味着午睡会挂起某个状态并通知观察者它。
有趣的是,几分钟前我刚回答了一个问题!你可能会发现这个答案是一个有用的起点。
就你而言,问题就在这里:

let req = ManifestCloud.shared.keys.request(.post, json: json)

这意味着只有你的请求钩子(.request(…)等)在你的POST请求完成时收到一个通知,而午睡不会让其他人观察到这个状态。
您通常可以通过使用onSuccess来实现这一点;但是,这会创建一个GET请求,您需要一个POST。你可能想这样different but related question
let keysResource = ManifestCloud.shared.keys
let req = keysResource.load(using:
    keysResource.request(.post, json: json))

这将获取POST请求返回的任何内容,并使其成为.load()的(可观察的)latestData,这将为您提供您正在寻找的“登录状态通知系统”。

关于ios - Siesta REST登录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49621243/

10-12 18:07