以更好的方式理解POST和GET的细微差别

时间:2014-05-06 05:43:27

标签: c# jquery asp.net asp.net-mvc

所以我是一名ASP.NET开发人员。首先我尝试了这个:

 $.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)

我的第一个错误是没有通过ASP.NET引擎解析和发现ID。

出于测试目的,我退后一步并停止传递id:

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

控制器签名;   [HTTPGET]     public JsonResult GetPrelimsByJob()

我的第二个错误是: 此请求已被阻止,因为当在GET请求中使用敏感信息时,可能会向第三方网站公开敏感信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet。

我知道我可以将JsonRequestBehavior设置为GET来解决这个问题,但为什么这是一个问题,为什么我的回复与我要做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)为什么在通过GET请求传递id时,我的id没有被ASP.NET引擎解析。

2)为什么我必须将JsonRequestBehavior设置为AllowGet以获取我的请求以允许JSON数据进入响应。

3)为什么POST只适用于这种情况,我正在获取数据,似乎RESTful HTTP动作动词GET应该是合适的选择。并不是说我试图严格遵守REST。

1 个答案:

答案 0 :(得分:1)

2)为了让您更加关注通过GET提供json所涉及的安全问题,请参阅此处:Why is JsonRequestBehavior needed?

3)默认情况下,浏览器不允许您制作跨域POST,这就是为什么POST的请求比GET请求更不容易受到CSRF的影响,因此您不会# 39;根本不需要设置JsonRequestBehavior。