gpt4 book ai didi

ios - 为 Siesta 资源配置请求方法

转载 作者:行者123 更新时间:2023-11-28 12:32:14 25 4
gpt4 key购买 nike

我有这个 api,其中登录通过 post 进行,而大多数其他请求使用 get。现在我正在使用 siesta 将登录 url 定义为资源。

func login(username: String, password: String) -> Resource {
return self.resource("login").withParam("username", username).withParam("password", password);
}

问题是,当我在此资源上使用 .loadIfNeeded() 时,它会执行一个获取请求,但这不会起作用,因为它需要是一个发布请求。

现在我知道 .decorateRequests 的存在,但我不确定如何使用它来使我的登录资源使用 post 作为请求方法。

提前致谢

彼得

最佳答案

Siesta 的 load()loadIfNeeded() 仅适用于 GET 请求。

为什么?这些 Siesta 方法建立在以下假设之上:它们没有副作用,它们的结果可以被缓存,并且它们可以安全地调用零次、一次或多次。在 HTTP 中,这是 GET 的约定。然而,POST、PUT 等不做任何这样的 promise ;每个请求都可以有单独的效果,因此重复或可选地调用它们是危险的。

要使用 POST、PUT 和 DELETE 发出请求,请使用 Resource.request(…) :

loginResource.request(.post)

(有关 request(…)load(…) 的区别的更多信息,请参阅 the section on requests in the Siesta user guide。)


为什么没有单独的设置,例如,使资源成为“POST 资源”?因为 REST 方法是 /foo 是逻辑事物(资源)的名称,而 GET/fooPUT/foo 是不同的对它的操作,一种是检索它的状态,另一种是改变它。这不仅仅是审美纯度的问题; GET 的强大 promise 与它密切相关。

如果您的 API 完全不是 REST 型的,那么 Siesta 可能不适合它。但是,您也可以编写一个 NetworkProvider,将 REST 形式的请求转换为您的 API 自己的结构,让 Siesta 本质上将其视为 REST API。


API 通常不会在查询字符串中获取密码(这是 withParam(...) 所做的),而是在帖子正文中。

(另外:如果您的 API 在查询字符串中使用密码,您可能不希望它这样做。查询字符串中的密码很容易泄露到不安全的地方——例如日志文件。但是您了解您的 API,而且我意识到你经常需要使用你所拥有的东西!)

如果您的 API 在 POST 主体而不是查询字符串中获取密码,您可以这样做:

// If it’s a JSON request
loginResource.request(.post, json: ["user": user, "password": pass])

// If it an HTML form encoded request
loginResource.request(.post, urlEncoded: ["user": user, "password": pass])

如果您真的希望 Siesta 缓存您的身份验证调用的结果,就像它 是 GET 请求一样,您可以使用 Resource.load(using:) :

authResource.load(using:
authResource.request(
.post, json: ["user": user, "password": pass]))

例如,如果您想使用 ResourceObserver 在应用程序中发布您的身份验证凭据,这将很有用。更常见的方法是使用 onSuccess Hook 一次获取凭据并更新服务配置,但 load(using:) 在某些情况下可能是一种有用的替代方法。

关于ios - 为 Siesta 资源配置请求方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com