3

我正在尝试使用 WEB API 创建我的第一个 REST 服务,以替换我在 web 表单 asp.net 项目中的一些回发。在 Web 表单项目中,当我浏览到一个新网页时,我总是会得到一个 ASP.net 应用程序变量和一个查询字符串值,它可以帮助我确定要连接到哪个数据库。在这个旧应用程序中,它连接到几个不同的数据库,这些数据库都具有相同的模式和数据库对象,但每个数据库中的数据不同

我不确定将这些变量传递给 REST 服务的最佳方式,或者它们是否应该成为路由或其他方法的一部分。

所以在像下面这样的 REST 方法中

    // GET api/<controller>/5
    public string GetCategoryByID(int id)
    {
        return "value";
    }

我可以获取类别 ID 并将其传递给我的数据库层,但我还需要上面提到的两个变量。为了访问适当的数据库,我需要在每次调用我的 REST api 时获取这些变量。我应该使用以下内容:

    // GET api/<controller>/5
    public string GetCategoryByID(int id, string applicationEnvironment, string organization)
    {
        return "value";
    }

或者他们应该是这样的路线的一部分:

api/{appEnvironment}/{organization}/{controller}/{id}

这似乎是一个简单的问题,但我无法找到解决方案。

4

4 回答 4

3

我最终通过我的 httpget 调用传递了额外的参数。除非我得到一些额外的反馈,否则我可能会遵循这种模式。

    [HttpGet]
    public Company[] GetProgramCompanies(int id, [FromUri] string org, [FromUri] string appEnvir)
    {
        DataLayer dataAccess = new DataLayer(Utilities.GetConnectionString(org, appEnvir));
        IEnumerable<BudgetProgramCompanyListing> companies = dataAccess.GetProgramCompaniesListing(id).OrderBy(o => o.Company_Name);

        Company[] returnComps = new Company[companies.Count()];
        int count = 0;

        foreach (BudgetProgramCompanyListing bpc in companies)
        {
            returnComps[count] = new Company
            {
                id = bpc.Company_ID,
                name = bpc.Company_Name
            };
            count++;
        }

        return returnComps;
    }

使用此 url 调用上述服务:

api/programcompanies/6?org=SDSRT&appEnvir=GGGQWRT

于 2013-08-14T22:08:54.997 回答
0

In .Net core 1.1 you can specify more parameters in HttGet attribute like this: [HttpGet("{appEnvironment}/{organization}/{controller}/{id}")]

It may work in other .Net versions too.

于 2017-07-30T11:49:02.800 回答
0

我曾经按照以下两种方法在 HttpGet 中传递多个参数

    public HttpResponseMessage Get(int id,[FromUri]int DeptID)
    {
        EmpEntity = new EmpDBEntities();
        var entity = EmpEntity.USP_GET_EMPINFO(id, DeptID).ToList();
        if(entity.Count()!=0)
        {
            return Request.CreateResponse(HttpStatusCode.OK, entity);
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Employee With ID=" + id.ToString() + " Notfound");
        }

    }

在上述方法中,webapi url 将是http://localhost:1384/api/emps?id=1&DeptID=1 USP_GET_EMPINFO 是具有两个参数的存储过程。

在第二种方法中,我们可以使用带有 [FromUri] 的类来传递多个参数。代码片段如下

    public HttpResponseMessage Get(int id,[FromUri]Employee emp)
    {
        EmpEntity = new EmpDBEntities();
        var entity = EmpEntity.USP_GET_EMPINFO(id,emp.DEPTID).ToList();
        if(entity.Count()!=0)
        {
            return Request.CreateResponse(HttpStatusCode.OK, entity);
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Employee With ID=" + id.ToString() + " Notfound");
        }

    }

并且 webapi url 将是http://localhost:1384/api/emps?id=1&DEPTID=1 这里 DEPTID 是类的属性之一。我们可以在url中添加多个用&分隔的参数

于 2018-04-09T13:39:07.543 回答
-1

您还可以定义一个模型并将其与请求一起发送,并使用 [FromBody] 将其绑定到您的 api 函数中的变量。

就像是:

[HttpGet]
public Company[] GetProgramCompanies([FromBody] YourModel model) { ... }

如此处所述,Asp.Net Core 中的模型绑定

于 2017-07-30T12:05:16.477 回答