2017-01-24 10 views
0

このapiは、他のほとんどのリクエストがgetで動作している間に、ログイン経由で動作します。今私はsiestaを使ってログインURLをリソースとして定義しています。シエスタのリソースのリクエスト方法を設定してください

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

問題は、私は、このリソースに.loadIfNeeded()を使用する場合、それはGETリクエストを行いますということですが、それはポスト要求する必要があるため、それは動作しません。

私は.decorateRequestsの存在を知っていますが、これを使用してログインリソースをリクエストメソッドとして投稿する方法を確信していません。事前に

おかげで、

ピーター

答えて

1

シエスタのload()loadIfNeeded()がGET要求のためだけです。

なぜですか?これらのシエスタメソッドは、副作用がなく、結果をキャッシュすることができ、ゼロ、1回、または何度も呼び出すことが安全であるという前提で構築されています。 HTTPでは、これはGETの契約です。しかし、POST、PUTなどは、そのような約束をしないでください。それぞれの要求は別々の効果を持つことができ、繰り返しか任意に呼び出すのは危険です。

POST、PUTを使用して要求を作成し、DELETE、Resource.request(…)を使用するには:

loginResource.request(.post) 

request(…)load(…)の違いについての詳細はthe section on requests in the Siesta user guideを参照してください。)


されていない理由たとえば、リソースを「POSTリソース」にするという別の設定があります。これは、/fooが論理的なものの名前であるリソースと、GET /fooおよびPUT /fooは、異なるアクションを実行します.1つは状態を取得し、もう1つは状態を変更します。これは単なる審美的純粋さの問題ではない。 GETの強い約束はそれに密接に結びついています。

APIが完全に非REST型である場合、Siestaはそれに適していない可能性があります。ただし、REST形式のリクエストをAPI独自の構造に変換するNetworkProviderを記述して、シエスタが本質的にREST APIとして扱うようにすることもできます。


APIは、通常、(withParam(…)が何をするかである)クエリ文字列ではなく、むしろポスト本体にパスワードを取ることはありません。

(別の方法として、APIがクエリ文字列でパスワードを取得する場合は、そのようにしたくないかもしれませんが、クエリ文字列のパスワードは安全ではない場所(ログファイルなど)に漏れやすくなります。私はあなたがしばしばあなたが持っているものと仕事をしなければならないことを理解しています!あなたが本当にシエスタが結果をキャッシュしたい場合は

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

:あなたのAPIが代わりにクエリ文字列のPOST本体にパスワードを取るん、あなたがこれを行うことができます可能性が高い場合には)

それはがGET要求されていたかのように、あなたのauthコールの、あなたがResource.load(using:)使用することができます。

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

をあなたがあなたを公開したい場合に便利です例えば、ResourceObserverを使用してアプリ内の資格情報を認証することができます。より一般的な方法は、onSuccessフックを使用して資格情報を一度取得してサービス設定を更新することですが、状況によってはload(using:)が役立ちます。

+0

まあ、大丈夫です。私はResource.request(..)を使用していると思うので、POST本体にログイン情報が必要ない場合は、私のapi開発者と話をします。本当に意味をなさない – blackwolf123333

関連する問題