2013-11-26 30 views
10

我有一條登錄路由,它應該將其輸入參數作爲POST變量傳輸。我定義我的路線是這樣的:在Play Framework中使用POST路由參數

POST /v1/accounts/login   controllers.v1.Accounts.login(username: String, password: String) 

和我的控制器是這樣的:

object Accounts extends Controller { 
    def login(username: String, password: String) = Action { 
    Ok("Foo " + username) 
    } 
} 

當我測試使用鉻合金Advance REST Client這條路它僅適用於GET參數,而不是如果我把它作爲application/x-www-form-urlencoded POST表單數據。

Play Framework documentation從來沒有提到POST參數,但也沒有說它不起作用。

我認爲如果我創建一個表單並將我的請求綁定到該表單上,但似乎是不必要的複雜,它可能會使其工作。

確實沒有辦法使用路由文件綁定POST參數嗎?

+0

我只注意到這一點:'如果操作方法定義了一些參數,所有這些參數值都將在請求URI中搜索,或者從URI路徑本身提取,或者從查詢字符串中提取出來,所以我想它確實不適用於POST參數。 – Mattias

回答

18

Route =解析URL中的參數=通過GET發送參數。

這意味着,你正在嘗試發送POST請求...... GET PARAMS ...意義在哪裏?

詹姆斯·羅珀解釋說:

在佈線時,播放尚未消耗的請求主體,所以一直沒有解析提交的表單。 - 而且你也不希望這樣做,因爲這是你決定如何/是否將請求主體解析,流式傳輸,發送到其他地方的行爲,如果Play在路由時執行此操作,則會限制您在某個操作中可以執行的操作。

從安全角度來看,在客戶端路徑中的每臺計算機的日誌中留下憑據肯定是不好的主意。

相反,你應該用常見的形式處理辦法做到像在base form documentation描述:

路線:

POST /v1/accounts/login  controllers.v1.Accounts.login 

行動:

val userForm = Form(
    tuple(
    "username" -> text, 
    "password" -> text 
) 
) 

def login = Action { implicit request => 
    val (username, password) = userForm.bindFromRequest.get 
    Ok("Hello " + username + ", you're trying to login with: " + password) 
} 
+0

謝謝,日誌文件是GET參數不被接受的原因之一。 所以它就像我懷疑的那樣,自動參數綁定只適用於GET參數,太糟糕了。 – Mattias

+0

如果你會使用更高級的表單即,這不是那麼戲劇性的方法,只需要多行。與預定義的約束,你會另外增加安全性,你可以檢查用戶名是否需要長度或它是否是電子郵件等;)豎起大拇指! – biesior

+2

在路由時間,Play尚未消耗請求正文,因此尚未解析提交的表單。 - 而且你也不希望這樣做,因爲這是你決定如何/是否將請求主體解析,流式傳輸,發送到其他地方的行爲,如果Play在路由時執行此操作,則會限制您在某個操作中可以執行的操作。 –