我使用.net MVC4的Web API(希望)实现一个RESTful API。 我需要在几个参数系统传递,并让它执行一些动作,然后返回对象为结果的列表。 具体来说,我想过去的两个日期,并返回落在它们之间的记录。 我还保持跟踪返回的记录,以便后续调用不要让系统重新处理。
我已经考虑了几个方法:
序列化PARAMS到一个单一的JSON字符串,并在API中除了采摘它。 http://forums.asp.net/t/1807316.aspx/1
传PARAMS在查询字符串。
什么是传递多个查询参数一个宁静的API最好的方法?
定义PARAMS的路线:API /控制器/日期1 /日期2
使用POST固有地让我传递一个对象使用参数。
研究ODATA因为在Web API(目前)支持它。 我没有做太多与此还,所以我不很熟悉。
如此看来,适当的休息实践表明,当数据被上拉,你应该使用GET。 然而,GET也应该nullipotent(不产生副作用),我不知道如果我的具体实施违反,因为我的API系统标记的记录,因此我产生副作用。
这也促使我支持可变参数的问题。 如果输入参数列表的变化,这将是乏味不得不重新定义你的路线选择3如果出现这种情况很多。 如果这些参数在运行时定义会发生什么事情?
在任何情况下,我的具体实现,它的选择(如果有的话)似乎是最好的?
Answer 1:
这是什么记录标记是什么意思? 如果这是仅用于记录的目的,我会用GET并禁用所有缓存,因为要登录该资源的每个查询。 如果记录标记还有另一个目的,POST是要走的路。 用户应该知道,他的行动影响系统和POST方法是一个警告。
Answer 2:
我认为,最简单的方法就是使用AttributeRouting
。
这是你的控制器中显而易见的,为什么你的全球公司希望这个WebApiConfig
文件?
例:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}
该{}
名称需要匹配您的参数。
就这么简单,现在你有一个单独的GET
能处理多种PARAMS在这种情况下。
Answer 3:
只需添加一个新的路线WebApiConfig
条目。
例如,要拨打:
public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..
加:
config.Routes.MapHttpRoute(
name: "GetPagedData",
routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);
然后添加参数到HTTP调用:
GET //<service address>/Api/Data/2/10
Answer 4:
我不得不实施问题的REST API,我需要传递参数。 我不希望这是马克的第一个例子描述了在同一样式的查询字符串传递参数“API /控制器?开始= DATE1&结束= DATE2”
在控制器我使用来自末梢URL分裂在C#?
// uri: /api/courses
public IEnumerable<Course> Get()
{
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var system = nvc["System"];
// BL comes here
return _courses;
}
在我来说,我打电话通过Ajax看着像的WebAPI:
$.ajax({
url: '/api/DbMetaData',
type: 'GET',
data: { system : 'My System',
searchString: '123' },
dataType: 'json',
success: function (data) {
$.each(data, function (index, v) {
alert(index + ': ' + v.name);
});
},
statusCode: {
404: function () {
alert('Failed');
}
}
});
我希望这有帮助...
Answer 5:
我发现了多方位的解决方案上http://habrahabr.ru/post/164945/
public class ResourceQuery
{
public string Param1 { get; set; }
public int OptionalParam2 { get; set; }
}
public class SampleResourceController : ApiController
{
public SampleResourceModel Get([FromUri] ResourceQuery query)
{
// action
}
}
Answer 6:
使用GET或POST显然是由@LukLed解释。 至于你可以传递参数,我建议用第二种方法去的方式(我不知道很多关于ODATA其一)。
1.Serializing的PARAMS到一个单一的JSON字符串,并在API中除了采摘它。 http://forums.asp.net/t/1807316.aspx/1
这不是用户友好和搜索引擎友好
2.Pass在查询字符串的PARAMS。 什么是传递多个查询参数一个宁静的API最好的方法?
这是通常优选的方法。
3.Defining的PARAMS在路由:API /控制器/ DATE1 / DATE2
这绝对不是一个好方法。 这使得感觉有些一个date2
是子资源date1
而事实并非如此。 无论是date1
和date2
的查询参数,并配备在同一水平线上。
在简单的情况下,我会建议一个URI这个样子,
api/controller?start=date1&end=date2
但我个人比较喜欢下面的URI模式,但在这种情况下,我们必须编写一些自定义代码的参数映射。
api/controller/date1,date2
Answer 7:
使用参数绑定作为完全形容这里: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Answer 8:
[Route("api/controller/{one}/{two}")]
public string Get(int One, int Two)
{
return "both params of the root link({one},{two}) and Get function parameters (one, two) should be same ";
}
根连杆({一个},{2})和Get功能参数(一个,两个)的两个PARAMS应该是相同
Answer 9:
public HttpResponseMessage Get(int id,string numb)
{
//this will differ according to your entity name
using (MarketEntities entities = new MarketEntities())
{
var ent= entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
if (ent != null)
{
return Request.CreateResponse(HttpStatusCode.OK, ent);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
}
}
}
Answer 10:
我知道这是真的老了,但我最近想同样的事情,这里是我的发现...
public HttpResponseMessage Get([FromUri] string var, [FromUri] string test) {
var retStr = new HttpResponseMessage(HttpStatusCode.OK);
if (var.ToLower() == "getnew" && test.ToLower() == "test") {
retStr.Content = new StringContent("Found Test", System.Text.Encoding.UTF8, "text/plain");
} else {
retStr.Content = new StringContent("Couldn't Find that test", System.Text.Encoding.UTF8, "text/plain");
}
return retStr;
}
所以,现在在您的地址/ URI / ...
HTTP(S):// myURL / API / myController的/ VAR = GETNEW&测试=测试
结果:“发现测试”
HTTP(S):// myURL / API / myController的/ VAR = GETNEW&测试=任何
结果:“无法找到该测试”
文章来源: How should I pass multiple parameters to an ASP.Net Web API GET?