配置Siesta资源的请求方法

时间:2017-01-24 16:09:13

标签: ios swift siesta-swift siesta

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

      reader.onload = (function(theFile) {
        return function(e) {

          //var test;
         // global.test = "hi";

           var results = e.target.result;

           var obj = JSON.parse(results);

          project_id = obj.project_id;
           client_email = obj.client_email;
          // private_key  = obj.private_key;

           //make it a hidden element 


          // Print the contents of the file
         var span = document.createElement('span');                    
         span.innerHTML = ['<p id= "data">',e.target.result,'</p>'].join('');
         document.getElementById('list').insertBefore(span, null);
        };
      })(f);

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

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

提前致谢,

彼得

1 个答案:

答案 0 :(得分:2)

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是逻辑事物的名称 - 资源 - 和{ {1}}和GET /foo是不同的操作,一个检索其状态,另一个更改它。这不仅仅是审美纯洁的问题; GET的强烈承诺与它密切相关。

如果您的API完全不是REST形状,Siesta可能不适合它。但是,您也可以编写一个PUT /foo,将REST形状的请求转换为您自己的API结构,让Siesta将其视为REST API。

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

(旁白:如果您的API确实在查询字符串中使用了密码,您可能不希望它。查询字符串中的密码很容易泄漏到不安全的地方 - 例如日志文件。但是您知道您的API,我意识到你经常要用你所拥有的东西来工作!)

如果您的API确实在POST正文中使用了密码而不是查询字符串,则可以执行以下操作:

withParam(…)

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

// 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])

如果您想使用authResource.load(using: authResource.request( .post, json: ["user": user, "password": pass])) 在应用内发布身份验证凭据,这非常有用。更常见的方法是使用ResourceObserver挂钩获取凭据一次并更新服务配置,但在某些情况下onSuccess可能是一种有用的替代方法。