【问题标题】:redirect one POST query to another with the same params .NET Core Web API使用相同的参数 .NET Core Web API 将一个 POST 查询重定向到另一个
【发布时间】:2020-04-10 17:40:30
【问题描述】:

我有 .NET Core Web API 应用程序。我有 3 个 API 端点: 接受相同参数的“/a”、“/b”、“/c”(带文件的表单参数)。

所以,用户确实请求“/a”,我检查了一些条件,需要将他重定向到具有相同(带文件的表单数据)参数的“/b”或“/c”。

重要的是:用户也可以单独执行“/b”或“/c”,而无需请求“/a”。另外我需要将用户重定向到“/a”内的“/b”或“/c”,所以我没有等待来自“/a”的响应,或者换句话说,来自“/a”的响应=重定向到其他端点.

有办法吗?

【问题讨论】:

    标签: .net-core asp.net-core-webapi


    【解决方案1】:

    您不能重定向到不同的 Web API 端点,但您可以执行以下操作之一:

    • 用户请求“/a”,您给他一个响应,其中包含指向“/b​​”或“/c”的 URL/URL。
    • 您已经实现了一项服务,并且您的控制器在逻辑上是干净的。因此,在控制器中,您只需检查应该调用“/a”、“/b”还是“/c”的服务方法。

    编辑3:

    我强烈推荐选项 2,因为您提到您有 3 个具有相同输入数据的控制器操作。因此,最好的方法是只有一个操作,并在其中调用您的服务方法ABC,具体取决于输入数据。

    编辑2:
    第一个选项伪代码:

    [HttpPost("/a")]
    public ActionResult<DefaultResponseModel> Verify(MyInputModel myModel)
    {
        MyResponse response = new MyResponse();
        if(myModel.MyProperty1 == "something")
        {
             response.RedirectURL = "https://myurl/a"
        }
        else if(myModel.MyProperty1 == "other")
        {
            response.RedirectURL = "https://myurl/b"
        }
        else
        {
            response.RedirectURL = "https://myurl/c"
        }
    
        return Ok(respomse);
    }
    

    编辑:
    如何执行第二个选项的示例。

    ConfigureServices 方法中的Startup.cs 文件中,您可以像这样注册一个服务:

    services.AddTransient<IMyService, MyService>();
    

    在你的控制器中,你通过依赖注入来注入它:

    public class BusinessController : ControllerBase
    {
        private readonly IMyService businessService;
    
        public BusinessController(IMyService businessService)
        {
            this.businessService = businessService;
        }
    
        // the actions are below..
        // code here    
    }
    

    然后让我们在你想要的操作中说“/a”

    [HttpPost("/a")]
    public ActionResult<DefaultResponseModel> Verify(MyInputModel myModel)
    {
        if(myModel.MyProperty1 == "something")
        {
             var response = this.businessService.A(myModel)
        }
        else if(myModel.MyProperty1 == "other")
        {
            var response = this.businessService.B(myModel)
        }
        else
        {
            var response = this.businessService.C(myModel)
        }
    }
    

    别忘了创建服务和实现。

    public interface IMyService
    {
        ResponseModel A(MyInputModel myModel);
        ResponseModel B(MyInputModel myModel);
        ResponseModel C(MyInputModel myModel);
    }
    

    以及服务的实现:

    public class MyService : IMyService
    {
        enter code here
    }
    

    【讨论】:

    • 你的意思是我需要使用中间件吗?你能给我一些实现的例子吗?
    • 已编辑,如果您想要第一个选项的示例,请写评论
    • 是的,请给我一个第一个选项的例子。我认为第二个与我不匹配,因为用户也可以单独执行“/b”或“/c”。
    • 添加了更多代码示例,根据您提供的信息,我建议使用编辑 3 中提到的选项。希望这对你有帮助:)
    • 非常感谢:)。但我需要将用户重定向到“/a”操作中的“/b”或“/c”
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多