2012-10-17 67 views
2

我正在使用JQuery和Jqgrid的MVC 4 Web API,直到現在我將多個數據發佈到我的後控制器操作。在將多個參數傳遞給MVC中的動作時,感到困惑是否使用GET或POST 4

我的行動看起來像下面的一個...

[ActionName("FetchProducts")] 
public List<ABC> PostProducts(Product model) 
{ 
    return _service.GetSomething(model); 
} 

public class Product{ 
    public string Name {get;set;} 
    public string Category {get;set;} 
    //.... and alteast 5 more properties 
} 

和我的jQuery的電話是類似下面的一個...

$.ajax({ 
type: "POST", 
url: /api/FetchProduct, 
data: this.getData(), 
contentType: "application/json; charset=utf-8", 
dataType: "json", 
success: callback 
}); 

function getData(){ 
    return JSON.stringify({ 
      Name: "from somewhere" , 
      Category: "from somewhere", 
      Price: "from somewhere", 
      ABC: "from somewhere", 
      XYZ: "from somewhere", 
      //... and many more.... 
     }); 
} 

和這個作品!但我的朋友在工作說

我實際上只是獲取數據,應該使用'GET'而不是'POST'。由於GET用於檢索遠程數據,並且POST用於插入/更新遠程數據。

我也覺得他是對的。那麼我應該如何使用'GET'來做到這一點?

我是否必須將所有這些參數(至少有10個)作爲查詢字符串?

像如:api/FetchProduct/?Name='aaa'&&Category='vvv'&&.........

所以我的問題是什麼人應該在這樣的情況呢?我想知道其他開發者對此有何想法。謝謝

+0

默認ModelBinder不能使用Get Params。通常,個人更喜歡使用POST,因爲它可能並不是完全需要的,但是這肯定會在過濾器數據增加時產生問題。所以它更好地根據我使用POST。 – bhuvin

回答

2

隨着查詢字符串的增長,您將遇到與瀏覽器相關的最大URL長度問題。

如果你有很多參數可以通過,即使你真的只有GET數據,POST也是完全可以接受的。但是,您將失去的是用戶使用查詢字符串爲特定頁面添加書籤的能力。

你應該絕對不會使用GET的一種情況是,如果你傳遞的任何參數都是敏感的。

+0

關於你最近對敏感參數的評論:你也不應該使用POST。 POST不比GET更安全。 –

+0

@DarinDimitrov:不是沒有加密,沒有。但也有類似sessionIDs的內容,您可能不希望將其放入GET中,因爲您不希望某人爲過期的sessionID添加書籤。當然,您也可以使用cookie。 –

+1

@DarinDimitrov我認爲Matt的觀點是GET查詢字符串參數在Web服務器上被記錄下來,並且通常會被忽視,因爲它們可以被不是主機服務器的服務器緩存。 – pvanhouten

1

一般來說,你的朋友是對的。使用GET代替POST也可能有緩存好處。要切換到get,您只需將您的代碼從帖子更新爲get即可。

$.ajax({ 
    type: "GET", 
    url: "/api/FetchProduct", 
    data: this.getData(), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: callback 
}); 

@MattBurland對於什麼時候使用GET和POST有幾個好的觀點。編輯: 這裏是一個jsfiddle的例子。按預期發送的請求是「/ echo/json /?value1 = 1 & value2 = 2」。

+0

我試過這個,這不起作用。我的產品模型輸入顯示爲空。 – Yasser

+0

啓動[fiddler](http://www.fiddler2.com/fiddler2/)或其他類型的調試代理來查看您的請求是什麼樣的,以確保您的查詢字符串按照您的預期構建。 – pvanhouten

+0

我剛剛注意到url沒有用引號包起來。更新我的帖子以包含這些引號。 – pvanhouten

0

我同意你的朋友在工作。 GET應該用於檢索數據,POST應該用於插入新數據。這個REST約定可以讓API的新開發者或用戶很容易理解。作爲查詢字符串中的參數傳遞的信息相當長是可以的。通常這些只是爲GET定義查詢的過濾器。如果有一個項目用作查詢的主鍵,則只需將其作爲URL的一部分傳遞即可。例如,如果名稱是主鍵或ID,然後在你的要求看起來是這樣的:

api/FetchProduct/aaa?Category=vvv&......... 

順便說一句,對於URL不會要求/使用單引號和參數的語法是由單個符號分隔。

0

如果您想使用GET而不是POST。 你的代碼應該在下面。

$.ajax({ 
    type: "GET", 
    url: "/api/FetchProduct", 
    data: this.getData(), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: callback 
}); 

和動作是

[ActionName("FetchProducts")] 
public List<ABC> PostProducts([FromUri]Product model) 
{ 
    return _service.GetSomething(model); 
} 

注意:該點是[FromUri]。

相關問題