2017-01-24 54 views
0

我有這個api,其中大多數其他請求使用get來登錄。現在我正在使用午睡將登錄網址定義爲資源。爲Siesta資源配置請求方法

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

的問題是,當我對這個資源使用.loadIfNeeded(),它會做一個GET請求,但不會工作,因爲它需要一個POST請求。

現在我知道.decorateRequests的存在,但我不確定如何使用它來使我的登錄資源使用post作爲請求方法。

由於提前,

彼得

回答

1

午睡的load()loadIfNeeded()僅用於GET請求。

爲什麼?這些Siesta方法建立在假設他們沒有副作用,他們的結果可以被緩存並且他們可以安全地調用零次,一次或多次的基礎上。在HTTP中,這是GET的合同。但是,POST,PUT等沒有做出這樣的承諾;每個請求可以具有單獨的效果,並且因此對於重複或可選地調用是危險的。

要使用POST,PUT提出請求,並刪除,使用Resource.request(…):(關於如何request(…)load(…)不同,更多信息請參見the section on requests in the Siesta user guide

loginResource.request(.post) 


爲什麼不有一個單獨的設置,例如,使資源成爲「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]) 

如果你真的想午睡到緩存結果您AUTH通話,就好像它是一個GET請求,您可以使用Resource.load(using:)

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

這是有用的,如果你想發佈您例如,在應用程序中使用ResourceObserver s驗證憑證。更常見的方法是使用onSuccess鉤子來獲取憑證一次並更新服務配置,但load(using:)在某些情況下可能是有用的替代方法。

+0

嗯,好的。我想我會使用Resource.request(..),然後,如果他們不想在發佈主體中登錄信息,我還會與我的api開發人員交談。這確實更有意義。 – blackwolf123333

相關問題