sig*_*606 131 asp.net rest asp.net-mvc asp.net-mvc-4 asp.net-web-api
我正在使用.Net MVC4 Web API(希望)实现RESTful api.我需要将一些参数传递给系统并让它执行一些操作,然后返回一个对象列表作为结果.具体来说,我传递了两个日期并返回它们之间的记录.我还跟踪返回的记录,以便后续调用不会在系统中重新处理.
我考虑过几种方法:
将params序列化为单个JSON字符串并在API中将其分开. http://forums.asp.net/t/1807316.aspx/1
在查询字符串中传递参数.
将多个查询参数传递给restful api的最佳方法是什么?
定义路径中的参数:api/controller/date1/date2
使用POST本身可以让我传递一个带有params的对象.
研究ODATA,因为Web API(目前)支持它.我还没有做太多,所以我对它不是很熟悉.
似乎正确的REST实践表明何时提取数据,您应该使用GET.但是,GET也应该是无效的(不会产生副作用),我想知道我的具体实现是否违反了,因为我在API系统中标记了记录,因此我产生了副作用.
它还引出了支持变量参数的问题.如果输入参数列表发生变化,那么如果发生很多事情,必须重新定义选择3的路线将是很繁琐的.如果在运行时定义参数会发生什么......
在任何情况下,对于我的具体实现,哪个选择(如果有的话)似乎最好?
Mar*_*.io 132
我认为最简单的方法就是简单地使用AttributeRouting
.
在您的控制器中显而易见,您为什么要在全局WebApiConfig
文件中使用它?
例:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}
Run Code Online (Sandbox Code Playgroud)
该{}
名称必须符合您的参数.
就这么简单,现在你有一个单独GET
处理这个实例中的多个参数.
Gra*_*ght 49
只需为WebApiConfig
条目添加新路由即可.
例如,致电:
public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..
Run Code Online (Sandbox Code Playgroud)
加:
config.Routes.MapHttpRoute(
name: "GetPagedData",
routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);
Run Code Online (Sandbox Code Playgroud)
然后将参数添加到HTTP调用:
GET //<service address>/Api/Data/2/10
Run Code Online (Sandbox Code Playgroud)
Nig*_*ter 45
我只需要实现一个RESTfull api,我需要传递参数.我通过传递查询字符串中的参数来完成此操作,其格式与Mark的第一个示例"api/controller?start = date1&end = date2"所描述的相同.
// uri: /api/courses
public IEnumerable<Course> Get()
{
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var system = nvc["System"];
// BL comes here
return _courses;
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我通过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');
}
}
});
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助...
小智 37
我在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
}
}
Run Code Online (Sandbox Code Playgroud)
Luk*_*Led 10
这个记录标记是什么意思?如果这仅用于记录目的,我将使用GET并禁用所有缓存,因为您要记录此资源的每个查询.如果记录标记有另一个目的,POST就是要走的路.用户应该知道,他的动作影响系统,POST方法是一个警告.
@LukLed清楚地解释了使用GET或POST.关于你可以传递参数的方法,我建议采用第二种方法(我对ODATA也不太了解).
1.将params转换为单个JSON字符串并在API中将其拆分.http://forums.asp.net/t/1807316.aspx/1
这不是用户友好和SEO友好
2.在查询字符串中输入params.将多个查询参数传递给restful api的最佳方法是什么?
这是通常的优选方法.
3.定义路径中的参数:api/controller/date1/date2
这绝对不是一个好方法.这使得感觉某人date2
是子资源date1
而事实并非如此.两者都是date1
和date2
查询参数并且处于同一级别.
在简单的情况下,我会建议像这样的URI,
api/controller?start=date1&end=date2
Run Code Online (Sandbox Code Playgroud)
但我个人喜欢下面的URI模式,但在这种情况下,我们必须编写一些自定义代码来映射参数.
api/controller/date1,date2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
291937 次 |
最近记录: |