user2680562
user2680562

Reputation: 61

Web API httpget with many parameters

I am trying to create my first REST service using WEB API to replace some of my postbacks in a web forms asp.net project. In the web forms project, when I browse to a new web page, I always get an ASP.net Application variable and a querystring value that helps me determine which database to connect to. In this old app, it connects to several different databases that all have the same schema and database objects but the data is different in each database

I am not sure the best way to pass these variables to a REST Service or if they should be part of the route or some other method.

So in a REST method like the one below

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

I can get the category id and pass that to my database layer, but I also need the two variables mentioned above. I will need to obtain these variables in every call to my REST api in order to access the appropriate database. Should I use something like the following:

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

Or should they be part of the route with something like this:

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

This seems like a simple problem, but I am having trouble figuring out a solution.

Upvotes: 3

Views: 13944

Answers (5)

Yaron Binder
Yaron Binder

Reputation: 126

You can separate the data with comma.

For me the following work perfectly:

[HttpGet("{value1},{value2}")]
public string GetCategoryByID(string value1, string value2) => $"{value1} {value2}";

Upvotes: 0

Ranajit kumar
Ranajit kumar

Reputation: 259

I used to follow the below two method to pass multiple parameter in 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");
        }

    }

and the webapi url will be http://localhost:1384/api/emps?id=1&DeptID=1 in the above methode USP_GET_EMPINFO is the stored procedure with two parameters.

in second method we can use the class with [FromUri] to pass multiple parameter. the code snippet is as below

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

    }

and the webapi url will be http://localhost:1384/api/emps?id=1&DEPTID=1 here the DEPTID is one of the property of the class. we can add multiple parameters separated with & in the url

Upvotes: 0

SteinTech
SteinTech

Reputation: 4068

You could also define a model and send that with the request and bind it to a variable in your api function using [FromBody].

Something like:

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

As explained here Model binding in Asp.Net Core

Upvotes: -1

user3285954
user3285954

Reputation: 4749

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.

Upvotes: 0

user2680562
user2680562

Reputation: 61

I ended up passing extra parameters with my httpget call. I will probably follow this pattern unless I get some additional feedback.

    [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;
    }

Calling the above service with this url:

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

Upvotes: 3

Related Questions