首页 文章

我应该如何将多个参数传递给ASP.Net Web API GET?

提问于
浏览
123

我正在使用.Net MVC4 Web API(希望)实现RESTful api . 我需要将一些参数传递给系统并让它执行一些操作,然后返回一个对象列表作为结果 . 具体来说,我传递了两个日期并返回它们之间的记录 . 我还跟踪返回的记录,以便后续调用不会在系统中重新处理 .

我考虑过几种方法:

似乎正确的REST实践表明何时提取数据,您应该使用GET . 但是,GET也应该是无效的(不会产生副作用),我想知道我的具体实现是否违反了,因为我在API系统中标记了记录,因此我产生了副作用 .

它还引出了支持变量参数的问题 . 如果输入参数列表发生变化,那么如果发生很多事情,必须重新定义选择3的路线将是很繁琐的 . 如果在运行时定义参数会发生什么......

在任何情况下,对于我的具体实现,哪个选择(如果有的话)似乎最好?

10 回答

  • 45

    这个记录标记是什么意思?如果这仅用于记录目的,我将使用GET并禁用所有缓存,因为您要记录此资源的每个查询 . 如果记录标记有另一个目的,POST就是要走的路 . 用户应该知道,他的动作影响系统,POST方法是一个警告 .

  • 37

    我认为最简单的方法就是使用 AttributeRouting .

    在您的控制器中显而易见,您为什么要在Global WebApiConfig 文件中使用它?

    例:

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
        public string Get(int paramOne, int paramTwo)
        {
            return "The [Route] with multiple params worked";
        }
    

    {} 名称需要与您的参数匹配 .

    就这么简单,现在你有一个单独的 GET 来处理这个实例中的多个参数 .

  • 123

    只需为 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
    
  • 10

    我只需要实现一个RESTfull api,我需要传递参数 . 我通过传递查询字符串中的参数来完成此操作,其格式与Mark的第一个示例“api / controller?start = date1&end = date2”所描述的相同 .

    在控制器中我使用了URL split in 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');
                           }
            }
       });
    

    我希望这有帮助...

  • 0

    我在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
        }
    }
    
  • 48

    @LukLed清楚地解释了使用GET或POST . 关于你可以传递参数的方法,我建议采用第二种方法(我对ODATA也不太了解) .

    1.将params转换为单个JSON字符串并在API中将其拆分 . http://forums.asp.net/t/1807316.aspx/1

    这不是用户友好和SEO友好

    2.在查询字符串中传递参数 . 将多个查询参数传递给restful api的最佳方法是什么?

    这是通常的优选方法 .

    3.定义路径中的参数:api / controller / date1 / date2

    这绝对不是一个好方法 . 这让人觉得有一个 date2date1 的子资源,事实并非如此 . date1date2 都是查询参数,并且处于同一级别 .

    在简单的情况下,我会建议像这样的URI,

    api/controller?start=date1&end=date2
    

    但我个人喜欢下面的URI模式,但在这种情况下,我们必须编写一些自定义代码来映射参数 .

    api/controller/date1,date2
    
  • 2
  • 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 ";
        }
    

    根链接()和Get函数参数(一,二)的两个参数应该相同

  • 0
    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");
                }
            }
        }
    
  • 8

    我知道这真的很老了,但我最近想要同样的东西,这就是我发现的......

    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&测试=任何

    结果:“无法找到该测试”

相关问题