2

我正在使用 Jquery 和 Jqgrid 开发 MVC 4 Web Api,直到现在我将多个数据发布到我的后控制器操作。

我的动作看起来像下面的那个......

[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'&&.........

所以我的问题是在这种情况下应该怎么做?我想知道其他开发人员对此有何看法。谢谢

4

4 回答 4

2

随着查询字符串的增长,您将遇到 URL 的最大长度问题,这取决于浏览器。

如果您有很多参数要传递,那么即使您实际上只是获取数据,POST 也是完全可以接受的。但是,您将失去的是用户使用查询字符串为特定页面添加书签的能力。

绝对不应该使用 GET 的一种情况是,如果您传递的任何参数都是敏感的。

于 2012-10-17T13:48:59.683 回答
1

一般来说,你的朋友是对的。使用 GET 而不是 POST 也有缓存的好处。要切换到获取,您只需将代码从帖子更新为获取。

$.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”。

于 2012-10-17T13:50:40.803 回答
0

我同意你朋友的工作。GET 应该用于检索数据,POST 应该用于插入新数据。此 REST 约定使 API 的新开发人员或用户易于理解。可以在查询字符串中作为参数传递的信息相当长。通常这些只是为您的 GET 定义查询的过滤器。如果有一个项目用作查询的主键,您可以将其作为 URL 的一部分传递。例如,如果 Name 是主键或 ID,那么您的请求可能如下所示:

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

顺便说一句,url 的语法不需要/使用单引号,参数由单个 & 符号分隔。

于 2012-10-17T13:52:33.390 回答
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]。

于 2012-10-17T16:22:53.840 回答