Route to different actions based on json value

前端 未结 2 1289
温柔的废话
温柔的废话 2021-01-03 05:40

I would like to route requests to different actions based on the value of a particular json parameter.

For example, given the following json data:



        
相关标签:
2条回答
  • 2021-01-03 06:00

    I'd much rather use a custom ApiControllerActionSelector.

    public class MyActionSelector : ApiControllerActionSelector
    {
        public override HttpActionDescriptor SelectAction(
                                    HttpControllerContext context)
        {
            HttpMessageContent requestContent = new HttpMessageContent(
                                                               context.Request);
            var json = requestContent.HttpRequestMessage.Content
                                    .ReadAsStringAsync().Result;
            string type = (string)JObject.Parse(json)["type"];
    
            var actionMethod = context.ControllerDescriptor.ControllerType
                .GetMethods(BindingFlags.Instance | BindingFlags.Public)
                .FirstOrDefault(m => m.Name == "Create" + type);
    
            if (actionMethod != null)
            {
                return new ReflectedHttpActionDescriptor(
                                   context.ControllerDescriptor, actionMethod);
            }
    
            return base.SelectAction(context);
        }
    }
    

    Here is the model. I gave it a weird name of Abc.

    public class Abc
    {
        public string Type { get; set; }
        public string Type1Data { get; set; }
    }
    

    Here is the action method.

    public void Createtype1(Abc a)
    {
    
    }
    

    Finally, plug-in the action selector.

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            config.Services.Replace(typeof(IHttpActionSelector),
                                        new MyActionSelector());
        }
    }
    

    If you now POST to http://localhost:port/api/yourapicontroller, depending on the value in type field in JSON, the action method Create* will be selected.

    0 讨论(0)
  • 2021-01-03 06:17

    Something like this. For simplicity, this example is not a proper async implementation.

    using System.Net.Http;
    using System.Web.Http;
    
    namespace MyApi.Controllers
    {
        public class MyType {
            public string type {get; set;}
        }
    
        public class MyType1 {
            public string type {get; set;}
            public string type1data {get; set;}
        }
    
        public class MyType2 {
            public string type {get; set;}
            public string type2data {get; set;}
        }
    
        public class ObjectsController : ApiController {
    
            //
            // api/objects/create
            //
            public void Create() {
                // buffer the content to allow the dual reads below
                Request.Content.LoadIntoBufferAsync().Wait();
    
                // get the body as a object so we can access its type property
                MyType postedObject = Request.Content.ReadAsAsync<MyType>().Result;
    
                // decide
                switch (postedObject.type) {
                    case "type1":
                        CreateType1(Request.Content.ReadAsAsync<MyType1>().Result.type1data);
                        break;
                    case "type2":
                        CreateType2(Request.Content.ReadAsAsync<MyType2>().Result.type2data);
                        break;
                    default:
                        // 400 Bad Request would be best, I think.
                        break;
                }
            }
    
            private void CreateType1(string type1data) {
                // ... 
            }
    
            private void CreateType2(string type2data) {
                // ...
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题