2014-05-06 39 views
1

所以我是一名ASP.NET開發人員。首先,我想這:以更好的方式瞭解POST和GET的細微差別

$.getJSON('/Admin/GetPrelimsByJob/109', function (data) { 
       var template = $('#optionTemplate').html(); 
       var html = Mustache.to_html(template, data); 
       $('#sampleArea').html(html); 
      }); 

用的控制器方法簽名:

[HttpGet] 
public JsonResult GetPrelimsByJob(int jobId) 

我的第一個錯誤是,ID沒有被解析並通過ASP.NET引擎發現。

出於測試目的,我向後退了一步,並停止通過一個id:

$.getJSON('/Admin/GetPrelimsByJob', function (data) { 
       var template = $('#optionTemplate').html(); 
       var html = Mustache.to_html(template, data); 
       $('#sampleArea').html(html); 
      }); 

隨着控制器簽名; [HTTPGET] 公共JsonResult GetPrelimsByJob()

我的第二個錯誤是: 該請求已被阻止,因爲敏感信息可能被泄露給第三方網站時,該GET請求中被使用。要允許GET請求,請將JsonRequestBehavior設置爲AllowGet。

我明白我可以設置JsonRequestBehavior來解決這個問題,但爲什麼這是一個問題,爲什麼我的響應與我做POST請求不同。

最後,得到的東西的工作我做:

$.postJSON('/Admin/GetPrelimsByJob', { jobId: 109 }, function (data) { 
       var template = $('#optionTemplate').html(); 
       var html = Mustache.to_html(template, data); 
       $('#sampleArea').html(html); 
      }); 

凡我控制器的簽名是:

[HttpPost] 
     public JsonResult GetPrelimsByJob(int jobId) 

而且在我的jQuery的擴展名是:

$.postJSON('/Admin/GetPrelimsByJob', { jobId: 109 }, function (data) { 
       var template = $('#optionTemplate').html(); 
       var html = Mustache.to_html(template, data); 
       $('#sampleArea').html(html); 
      }); 

我如果我切換到POST請求,我知道我會使所有的工作,但我想知道爲什麼。

所以回顧一下: 1)爲什麼我的id沒有通過GET請求傳遞id時被ASP.NET引擎解析。

2)爲什麼我必須將JsonRequestBehavior設置爲AllowGet才能讓我的請求允許JSON數據在響應中。

3)爲什麼POST只是在這種情況下工作,我得到的數據,似乎RESTful HTTP動作動詞GET應該是合適的選擇。並不是說我試圖嚴格遵守REST。

+0

你能否提供更多關於你得到的錯誤的細節1)你的路由配置也會得心應手... – miensol

回答

1

2)爲了讓你更關心涉及通過獲取詳細說明,請參見這裏服務的JSON安全問題:Why is JsonRequestBehavior needed?

3)默認情況下,瀏覽器不會讓你做跨域POST的,這就是爲什麼POST的請求是比GET請求更容易受到CSRF的攻擊,因此你根本不需要設置JsonRequestBehavior。