Siesta 的load()
和loadIfNeeded()
仅用于 GET 请求。
为什么?这些 Siesta 方法是建立在这样的假设之上的:它们没有副作用,它们的结果可以被缓存,并且它们可以安全地调用零次、一次或多次。在 HTTP 中,这是 GET 的合约。但是,POST、PUT 等不作任何此类承诺;每个请求都可以产生单独的效果,因此重复或随意调用它们是危险的。
要使用 POST、PUT 和 DELETE 发出请求,请使用Resource.request(…)
:
loginResource.request(.post)
(请参阅Siesta 用户指南中有关请求的部分,了解request(…)
与load(…)
.
为什么没有单独的设置来例如使资源成为“POST 资源”?因为 REST 方法是/foo
一个逻辑事物的名称——一种资源——并且GET /foo
是PUT /foo
对它的不同操作,一个检索它的状态,一个改变它的状态。这不仅仅是审美纯洁的问题。GET 的坚定承诺与此密切相关。
如果您的 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
s 在应用程序中发布您的身份验证凭据,这将非常有用。更常见的方法是使用onSuccess
钩子来获取凭据一次并更新服务配置,但load(using:)
在某些情况下可能是一种有用的替代方法。