c # MapHttpAttibuteRoutes не может использовать одно и то же действие с другим параметром? - PullRequest
0 голосов
/ 07 сентября 2018

Я новичок в c # и застрял в атрибутах маршрутов.

Теперь я хочу создать API для пользователей GET, POST, PUT и DELETE.

Я не знаю, как описать проблему, и самое знакомое, что я нашел, не является правильным ответом на мой случай.

Как использовать атрибут Route для связывания строки запроса с веб-API?

[HttpGet]
public class UsersController : ApiController
{
    // GET /api/users
    [HttpGet]
    [Route("")]
    public IEnumerable<User> GetUsers()
    {
        return _context.Users.ToList();
    }

    [Route("api/users/{FirstName?}/{LastName?}")]
    public IEnumerable<User> GetByFirstName(string FirstName = null, string LastName = null)
    { 
        var users = Enumerable.Empty<User>();
        if (FirstName != null && LastName != null)
            users = _context.Users.Where(u => (u.FirstName == FirstName) && (u.LastName == LastName));
        else if (FirstName != null)
            users = _context.Users.Where(u => u.FirstName == FirstName);
        else if (LastName != null)
            users = _context.Users.Where(u => u.LastName == LastName);

        return users;
    }
}

Это то, что у меня есть для моего контроллера, а ниже то, что у меня есть для WebApiConfig.cs В основном я использовал config.MapHttpAttributeRoutes ();

    public static void Register(HttpConfiguration config)
    {
      // Web API configuration and services
        config.MapHttpAttributeRoutes();

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

Почему я не могу вызвать API по http://localhost:50861/api/users?LastName=someName&FirstName=someName

Любой совет очень важен. Или любые ссылки на эту проблему также полезны! Спасибо

Редактировать: я только что обновил другую часть своего кода. Так как, когда я использую API выше для запроса, я получил результат этого /api/users.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Измените ваш GetByFirstName как показано ниже

[HttpGet]
[Route("api/users/name")]
public IEnumerable<User> GetByFirstName(string FirstName = null, string LastName = null)
{ 
    var users = Enumerable.Empty<User>();
    if (FirstName != null && LastName != null)
        users = _context.Users.Where(u => (u.FirstName == FirstName) && (u.LastName == LastName));
    else if (FirstName != null)
        users = _context.Users.Where(u => u.FirstName == FirstName);
    else if (LastName != null)
        users = _context.Users.Where(u => u.LastName == LastName);

    return users;
}

И тогда ваш URL будет похож на

GET http://localhost:50822/api/users/name?FirstName=Will&LastName=abc
0 голосов
/ 07 сентября 2018

Вы определяли маршрут по

[Route("api/users/{FirstName?}/{LastName?}")]

Так что ваш звонок должен понравиться

http://localhost:50861/api/users/someName/someName

Если вы хотите вызывать API с помощью строки запроса, как ваш вызов, тогда ваш маршрут должен быть определен как

[Route("api/users")]

Но это будет конфликтовать с вашим методом GetUsers. Таким образом, вы можете определить его как

[Route("api/users/byname")]

И звоните как

http://localhost:50861/api/users/byname?FirstName=abc&LastName=xyz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...