【问题标题】:Configure request method for a Siesta resource为 Siesta 资源配置请求方法
【发布时间】:2017-06-09 12:44:14
【问题描述】:

我有这个 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 作为请求方法。

提前致谢,

彼得

【问题讨论】:

    标签: ios swift siesta-swift siesta


    【解决方案1】:

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

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

    要使用 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 的坚定承诺与此密切相关。

    如果您的 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]))
    

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

    【讨论】:

    • 嗯,好的。我想我会使用 Resource.request(..) 然后,如果他们不希望帖子正文中的登录信息,我也会与我的 api 开发人员交谈。这确实更有意义。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2013-03-19
    • 2014-08-12
    • 2012-09-27
    相关资源
    最近更新 更多