2011-12-01 149 views
0

我已經看到了計算器一些帖子說 「sending list of items in the GET Method, is NOT allowed. It has to be accomplished via POST method only如何使用GET請求將對象傳遞給RESTful服務?

我的代碼看起來像

[OperationContract] 
    [WebGet(UriTemplate = "Employee/{emp}",RequestFormat=WebMessageFormat.Json)] 
    Employee GetEmpDetails(string emp); 

和我的輸入JSON對象將是「{ 'ID':1, '名': '測試' ,...} 有沒有達到這個問題的任何替代方法。

感謝

+0

什麼讓你覺得你會得到不同的答案? –

回答

3

它可以發送與GET的產品清單,它只是開箱唯一原始值S的upported。字符串值工作得很好,但如果你想傳遞一個複雜的對象,你需要創建一個自定義的QueryStringConverter。在http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/09/wcf-extensibility-querystringconverter.aspx的帖子解釋瞭如何做到這一點。

+0

感謝您的快速回復,但通過查詢字符串傳遞約10個參數看起來很複雜。有沒有其他的方式通過GET請求來實現這一點? – Amarnath

+0

GET請求不能有正文,所以傳遞參數的唯一方法是通過查詢字符串。如果您傳遞了許多參數,則應考慮將其更改爲POST請求。 – carlosfigueira

+0

感謝卡洛斯最後我改變POST請求,它的工作,但它是誤導用戶即使服務正在獲取結果,但在REST /幫助它顯示POST請求。我想這是REST的限制。 – Amarnath

2

如果您將服務設置爲RESTful,那麼最有可能將HTTP PUT用於添加方法,並將HTTP POST用於更新方法。將對象傳遞給這些方法是絕對可以的,因爲objet將成爲HTTP請求的一部分,而不是URI的一部分。 URI對HTTP GET請求很重要。 HTTP GET請求應該只用於數據檢索而不用於數據修改。

+0

感謝您的快速回復。在我的GET請求中,我沒有修改數據只是發送過濾條件(例如:包含10個參數),只是基於過濾條件檢索結果。我們如何通過GET請求來實現這一點。 – Amarnath

+0

您可以使用完全基於DTO的Servicestack(http://www.servicestack.net/)來實現您的目標,請看一下。 –

+0

@ Arun Rana:太棒了!你有什麼建議如何使用Java做到這一點? – Wizard

1

您正在混合使用HTTP GET/POST/...請求和REST GET/POST/PUT/DELETE/... 當您想要RESTfully時 - 您執行GET請求。你的情況,我認爲它應該看起來像

employee/{id} 

employee/{name} 

另外請注意小寫在URI即使用最好。 如果需要多個GET的標準,我認爲這可能是這樣的:

employee/id/{id}/name/{name} 
+0

謝謝,我們已經看到了這個選項,因爲我們想發送一個包含10-12個參數的自定義過濾器,這個url可能看起來非常冗長 - 例如 - 僱員/姓名/ {姓名} /年齡/ {年齡} /地址/ {地址}/doj/{加入日期}/dob/{出生日期} ...........等等,我們的想法將它打包成一個json對象並在服務中反序列化,如 - {'name':'sam','age':'23'.....}。 – Amarnath

+0

WebGet可以使用querystring選項,如上例所示,但當我們嘗試使用json類型內容發送單個字符串參數時失敗。我們看到了使用POST/PUT請求完成的示例,但我們想知道是否有任何方法可以通過簡單GET獲取 – Amarnath

+0

如果參數的數量/名稱未知,可以將屬性更改爲 [WebGet (UriTemplate =「employee」,RequestFormat = WebMessageFormat.Json)] ,然後在方法內部「手動」分析URI參數。 但是,當然,您需要將您的「搜索參數」對象作爲URI參數傳遞。 –

相關問題