配置Siesta资源的请求方法
我有这个api,登录通过post工作,而大多数其他请求使用get。 现在我正在使用siesta将登录URL定义为资源。
func login(username: String, password: String) -> Resource { return self.resource("login").withParam("username", username).withParam("password", password); }
问题是,当我在此资源上使用.loadIfNeeded()时,它将执行get请求,但这不起作用,因为它需要是一个post请求。
现在我知道.decorateRequests的存在,但我不确定如何使用它来使我的登录资源使用post作为请求方法。
提前致谢,
彼得
Siesta的load()
和loadIfNeeded()
仅适用于GET请求。
为什么? 那些Siesta方法建立在假设它们没有副作用,它们的结果可以被缓存,以及它们可以安全地调用零,一次或多次的基础上。 在HTTP中,这是GET的合同。 但是,POST,PUT等不做任何这样的承诺; 每个请求都可以有单独的效果,因此重复或可选地调用它们是危险的。
要使用POST,PUT和DELETE发出请求,请使用Resource.request(…)
:
loginResource.request(.post)
(有关request(…)
与load(…)
不同之处的更多信息,请参阅Siesta用户指南中的请求部分 。)
为什么没有单独的设置,例如,使资源成为“POST资源?”因为REST方法是/foo
是逻辑事物的名称 – 资源 – 和GET /foo
和PUT /foo
是对它的不同操作,一个检索其状态,另一个更改它。 这不仅仅是审美纯洁的问题; GET的强烈承诺与它密切相关。
如果您的API完全不是REST形状,Siesta可能不适合它。 但是,您也可以编写一个NetworkProvider
,将REST形状的请求转换为API自己的结构,让Siesta将其视为REST API。
API通常不会在查询字符串中使用密码(这是withParam(…)
所做的),而是在post正文中。
(旁白:如果您的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将auth调用的结果缓存为GET请求,那么你可以使用Resource.load(using:)
:
authResource.load(using: authResource.request( .post, json: ["user": user, "password": pass]))
例如,如果要使用ResourceObserver
在应用程序中发布身份validation凭据,这将非常有用。 更常见的方法是使用onSuccess
挂钩一次获取凭据并更新服务配置,但在某些情况下, load(using:)
可能是一个有用的替代方法。
- 调暗UITableViewCell上的tintColor
- 从超级视图中删除当前视图
- 如何在显示启animation面的同时从networking服务加载数据?
- connectionDidFinishLoading:不使用[NSURLConnection sendAsynchronousRequest:queue:completionHandler:
- 具有自动布局和节重装的UITableViewHeaderFooterView子类不能很好地协同工作
- Xcode 6 / iOS – Archive&Info.plist缺失
- Ad-Hoc分布式应用程序未能及时启动
- 单个应用程序二进制文件如何支持64位和32位应用程序
- 如何在Swift3中打开一个URL