2012-03-06 50 views
1

比方說,我有一個路線如何分隔路由和查詢參數?

POST  /api/{id}/{application} Application.doSomething 

如何Application.doSomething可以方便地訪問所有的查詢參數,包括「ID」和「應用」?

如果我把它作爲

curl -X POST -d 'id=test&application=test' -v /api/12345/myapp 

然後request.params「ID」和「應用」將被設置爲路由參數「12345」和「MYAPP」,而不是查詢參數「測試」。

而我不能看到我如何訪問那些沒有手動解析request.params'身體',這是一種愚蠢的。

編輯:對不起,也許它不是很清楚。假設doSomething控制器將所有查詢參數保存在某處的鍵值存儲中。對於這個ID和應用程序。而且它完全是任意鍵。所以現在有了這個結構,你不能把'id'和'application'作爲關鍵字,只是因爲我使用了這些名字作爲路由參數,這不應該成爲客戶關心的問題。基本上我只需要訪問正常的查詢參數,而無需將路由參數放入同一個桶中!

+0

我在你的問題中提出了一些小修改的建議,以便它比你沒有要求修改'params'更清楚 - 這是我最初理解的:)。請檢查他們並隨時改善/拒絕! – Stefano 2012-03-07 15:26:18

回答

0

有一個簡單的方法來訪問原始查詢字符串:

控制器內部操作訪問對象,例如。

public static void action(){ 
    String qs = request.querystring; 
} 

這就是說,在查詢字符串和路由中使用相同的參數名稱並不是很明顯,REST-wise;

使ROUTE「ID」和「應用」的名字在路由文件更加明確了,你就沒有更多的碰撞......

[編輯1]

我明白查詢字符串可能是「任意」參數:是,如果你的名字:

POST  /api/{object_id}/{play_application} Application.doSomething 

我真的懷疑你將有一個碰撞;-)

在Java中解析查詢字符串非常微不足道,例如。請參閱https://stackoverflow.com/a/2969715/422670

在Play中創建「params」地圖的大部分複雜性都是由於將post/get/route/etc結合在一起......所以您不能以某種方式請求play來爲您工作會爲其他人打破它!

+0

當然,但我需要自己解析查詢字符串。如何更明確地命名它們? ______MYPRIVATEID98123981239______?所以它不太可能作爲查詢參數出現?那麼原則上不是真正解決問題,不是嗎? – Eugene 2012-03-06 14:55:45

+0

@Eugene自己解析查詢字符串很簡單;使您的用例在Play上運行意味着Play不會再適用於任何其他用戶......所以我認爲我的解決方案可以解決您的問題,只要它是可以解決的! (PS。是的,這實際上不太可能發生作爲查詢參數:)) – Stefano 2012-03-06 15:01:57

+0

那麼,我知道,但我希望它可以做得更優雅,我只是錯過了某種方法或地圖...我不是主張打破現有的功能,而只是request.params上的附加方法,它將返回只有查詢參數的地圖,這將會非常有用。特別是考慮到遊戲結合了路徑參數和查詢參數本身的顯而易見的事實,但是你不能訪問查詢參數...... – Eugene 2012-03-06 15:07:51

0

我認爲你是混淆路線的使用。這條線:

POST  /api/{id}/{application} Application.doSomething 

集,當你得到一個請求,讓我們說/api/12345/myapp,中間部分將與要求相匹配,並且您定義的任何參數將被提取。

在樣本請求/api/12345/myapp參數id將獲得值和參數applicationMyApp的

在您的請求中,當您調用/api/12345/myapp時,參數已被分配並且片段id=test&application=test被忽略。

你應該把它叫做/api/test/test/來得到你想要的結果。

+0

是的,但重點是你需要用任何查詢參數調用/ api/{id}/{application},包括我用來構造url的那些查詢參數。所以它不總是id,並不總是應用程序,它可以是任何東西。然後,所有這些參數都會發生。但是現在我在查詢參數和路由參數之間有衝突,所以我不能再使用任何查詢參數。 – Eugene 2012-03-06 14:35:10

+0

錯誤,也許我正在解釋它porrly。我已經更新了原文,希望能更好地說明它。 – Eugene 2012-03-06 14:42:26

+0

@Eugene爲什麼你想要調用ROUTE params和GET參數一樣?它沒有什麼意義......如果你想通過查詢字符串來傳遞它,你應該調用/ api/application/without/id/ – Stefano 2012-03-06 14:44:03

0

玩這個東西給你。 Play能夠從請求參數中綁定甚至複雜的Java對象。我認爲這個POST請求反序列化是默認的。

你讓一個由你的請求參數發送一個Java對象:

public class MyObject { 
    public String id; 
    public String application; 
} 

而在你應用控制器的方法這個對象是你的論點:

public static void doSomething(MyObject aObject) { 
    // do your thing 
} 
+0

是的,但重點是你需要用任何查詢參數調用/ api/{id}/{application},包括我用來構造url的那些參數。所以它不總是id,並不總是應用程序,它可以是任何東西。然後,所有這些參數都會發生。但是現在我在查詢參數和路由參數之間有衝突,所以我不能再使用任何查詢參數。 – Eugene 2012-03-06 14:34:11