简体   繁体   中英

how to set routing for unusual endpoint api configuration?

I am building a new webapi for use at work. Where I have to develop a webapi2 application that fits the following endpoint schema

/file
/file/[data id]
/file/[data id]/documents
/file/[data id]/conditions

In my controller I have the following code:

public class FileController : ApiController
{
    [HttpPost]
    public HttpResponseMessage ImportFile()
    {
        var act = Request.Headers.Accept.ToString();

        // test content type for "application/vnd.exp"

        return Request.CreateResponse(HttpStatusCode.OK, $"Successful import @ {DateTime.Now}");
    }

    [HttpPatch]
    public HttpResponseMessage UpdateDataByFile(string dataId)
    {
        var act = Request.Headers.Accept.ToString();


        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpPatch]
    public HttpResponseMessage UpdateDataIntake(string dataId)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpGet]
    public HttpResponseMessage GetDataConditionsForUser(string dataid)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful get");
    }
}

My route config looks like the following:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "Files1",
            routeTemplate: "{controller}/{action}"
        );

        routes.MapHttpRoute(
            name: "Files2",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );


    }
}

My question is how do I configure the routing so that it matches the endpoint configuration

eg: " https://something.com/file/123412/document "

and have it hit the correct controller method?

Really confused about how to set routing in an environment like this.

You can do something like this-

        routes.MapHttpRoute(
            name: "File",
            routeTemplate: "file",
            defaults: new { controller = "File", action = "ImportFile" }
        );

        routes.MapHttpRoute(
            name: "FileUpdate",
            routeTemplate: "file/{dataId}",
            defaults: new { controller = "File", action = "UpdateDataByFile" }
        );

        routes.MapHttpRoute(
            name: "FileDocuments",
            routeTemplate: "file/{dataId}/documents",
            defaults: new { controller = "File", action = "UpdateDataIntake" }
        );

        routes.MapHttpRoute(
            name: "FileConditions",
            routeTemplate: "file/{dataId}/conditions",
            defaults: new { controller = "File", action = "GetDataConditionsForUser" }
        );

        routes.MapHttpRoute(
            name: "Files1",
            routeTemplate: "{controller}/{action}"
        );
        routes.MapHttpRoute(
            name: "Files2",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );

That means you are using a custom route for each Action. You are only using these routes for urls that start like 'file/'. You have a lot of different ways that you can do this.

If you use {controller} in these templates and remove default: controller = "File" then you will match for other controllers.

If you can rename your Controller Actions to match your routing you may be able to fit them into a pattern, and use the {action} in the template.

routes.MapHttpRoute(
            name: "File",
            routeTemplate: "{controller}/{dataId}/{action}",
            defaults: new {}
        );

If you rename your last two Actions this should match them.


public class FileController : ApiController
{

    [HttpPatch]
    public HttpResponseMessage Documents(string dataId)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpGet]
    public HttpResponseMessage Conditions(string dataid)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful get");
    }
}

And if you set a default action in that route, you can also match your second Action

routes.MapHttpRoute(
            name: "File",
            routeTemplate: "{controller}/{dataId}/{action}",
            defaults: new { action = "UpdateDataByFile" }
        );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM