【问题标题】:How to use multiple GET action in a WebApi?如何在 WebApi 中使用多个 GET 操作?
【发布时间】:2017-05-22 23:05:05
【问题描述】:

好吧,我实际上是在尝试学习 WebApi,并假设我有一个场景,我有两个像这样的 get 方法

控制器

public class EmployeeApiController : ApiController
{
    public List<Student> GetAllStudents() { ... }

    public List<Student> EmailChange(string studentName, string Email) { ... }

    public List<Student> AddressChange(string studentName, string Address) { ... }
}

public class Student
{
    public string StudentName { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public static List<Student> students { get; set; }
}

我无法调用相应的方法,我该怎么做,我知道有很多博客,但它并没有帮助我理解如何真正访问这些方法。通过浏览几个博客,我编写了这样的整个代码

WebApiConfig 代码

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

控制器代码

    public List<Student> GetAllStudents()
    {
        Student.students = new List<Student> {
            new Student { StudentName="foo",Address="usa",Email="foo@yahoo.com"},
            new Student { StudentName="joe",Address="mumbai",Email="joe@yahoo.com"},
            new Student { StudentName="albert",Address="georgia",Email="albert@yahoo.com"},
            new Student { StudentName="prince",Address="missisipi",Email="prince@yahoo.com"}
        };
        return Student.students;
    }
    [HttpGet]
    public List<Student> UpdateEmail(string studentName, string Email)
    {
        return Student.students.Select(i =>
        {
            if (i.StudentName == studentName)
            {
                i.Email = Email;
            }
            return i;
        }).ToList();

    }
    [HttpGet]
    public List<Student> UpdateAddress(string studentName, string Address)
    {
        return Student.students.Select(x =>
        {
            if (x.StudentName == studentName)
            {
                x.Address = Address;
            }
            return x;
        }).ToList();
    }
}

public class Student
{
    public string StudentName { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public static List<Student> students { get; set; }
}

我对如何使用 GET 请求访问 UpdateEmail 方法和 UpdateAddress 方法有点困惑。

更新 1

当我这样打电话时

http://localhost:53711/api/EmployeeApi/UpdateAddress

http://localhost:53711/api/EmployeeApi/UpdateEmail

我收到这样的错误

当我像这样拨打电话时,我会收到类似的错误

http://localhost:53711/api/EmployeeApi/UpdateEmail/foo/foo

【问题讨论】:

  • 添加您用于通话的路线。
  • @LijinJohn 你是对的我误读了错误信息。问题是您显示的所有操作都与输入的网址不匹配。
  • @Nkosi 请问你知道解决方案吗,其实我很长时间都在为这个问题挠头
  • 假设你在url模板中有{id}参数并且你在url中输入了foo,但是在任何action中都没有匹配的参数,所以路由无法匹配。 foo 到底应该填充什么?
  • 此外,用于您的操作的命名约定具有误导性。您正在执行 GET,但这些操作的名称中包含 Update。这通常意味着 POST 或 PUT 方法

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-routing


【解决方案1】:

将模板更改为routeTemplate: "api/{controller}/{action}/{studentName}",并保留方法

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{studentName}"
    );
}

保持模板不变,即:"api/{controller}/{action}/{id}" 并将方法参数更改为(string id,.......)

[HttpGet]
public List<Student> UpdateEmail(string id, string Email) { ... }

您也可以放弃基于约定的路由并使用属性路由

[RoutePrefix("api/EmployeeApi")]
public class EmployeeApiController : ApiController
{
    //GET api/EmployeeApi
    [HttpGet]
    [Route("")]
    public List<Student> GetAllStudents() { ... }

    //GET api/EmployeeApi/EmailChange/foo/foo@email.com
    [HttpGet]
    [Route("EmailChange/{studentName}/{email}")]
    public List<Student> EmailChange(string studentName, string email) { ... }

    //GET api/EmployeeApi/AddressChange/foo/China
    [HttpGet]
    [Route("AddressChange/{studentName}/{address}")]
    public List<Student> AddressChange(string studentName, string Address) { ... }
}

【讨论】:

  • 非常感谢您花时间向我解释 webApi 的工作原理
【解决方案2】:

您的 WebApConig.cs 应如下所示 -

api/{controller}/{action}/{id}

然后发出类似 -

的调用
http://localhost:port/api/Ctrl/action

【讨论】:

  • 请查看我的更新以获取您给出的答案,谢谢
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多