Метод HttpClient GET со строковым параметром - PullRequest
0 голосов
/ 14 января 2019

Я создаю приложение, которое будет размещать базу данных и взаимодействовать с веб-сайтом и wpf-приложением через Web API. Итак, проблема заключается в следующем: как я могу сделать GET-запрос со строковым параметром? Я уже делал подобную вещь, но с целочисленным параметром. Почти тот же код не работает для строкового параметра. Почему?

Код, который работает с int param: Метод контроллера:

[HttpGet]
    [ActionName("GetResItems")]
    public IHttpActionResult GetResItems(int id)
    {
        using (var db = new FoodOrderingContext())
        {
            List<ItemsInRestaurant> list = db.ItemsInRestaurants.Where(x => x.ItemId == id).ToList();
            List<ItemsInRestaurantVM> toSend = new List<ItemsInRestaurantVM>();

            foreach (var item in list)
            {
                toSend.Add(new ItemsInRestaurantVM(item));
            }

            if (toSend.Count == 0)
            {
                return NotFound();
            }

            return Ok(toSend);
        }
    }

Код на стороне клиента WPF:

public List<ItemsInRestaurantVM> GetResItems(int id)
    {
        List<ItemsInRestaurantVM> list = null;

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:52407/");
            var responseTask = client.GetAsync("api/item/getresitems/" + id);
            responseTask.Wait();

            var result = responseTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readingTask = result.Content.ReadAsAsync<List<ItemsInRestaurantVM>>();
                readingTask.Wait();

                list = readingTask.Result;
            }
        }

        return list;
    }

Теперь код, который НЕ работает: Сторона сервера:

[HttpGet]
    [ActionName("GetTop10Items")]
    public IHttpActionResult GetTop10Items(string type)
    {
        using (var db = new FoodOrderingContext())
        {
            List<Top10ItemsVM> list = new List<Top10ItemsVM>();

            foreach (var item in db.Items.ToList())
            {
                if (item.Type.Equals(type))
                {
                    Top10ItemsVM toAdd = new Top10ItemsVM();
                    toAdd.Name = item.Name;
                    toAdd.Price = item.Price.ToString() + " $";
                    toAdd.Ammount = db.OrderItems.Where(x => x.ItemId == item.ItemId).Select(x => x.Ammount).Sum().ToString();
                    toAdd.Total = (db.OrderItems.Where(x => x.ItemId == item.ItemId).Select(x => x.Ammount).Sum() * item.Price).ToString() + " $";
                    list.Add(toAdd);
                }
            }

            if (list.Count > 0)
            {
                return Ok(list);
            }
            else
            {
                return NotFound();
            }
        }

Клиентская сторона:

public List<Top10ItemsVM> GetTop10Items(string type)
    {
        List<Top10ItemsVM> list = null;

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:52407/");
            var responseTask = client.GetAsync("api/item/GetTop10Items/" + type);
            responseTask.Wait();
            var result = responseTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<List<Top10ItemsVM>>();
                readTask.Wait();
                list = readTask.Result.OrderByDescending(x => x.Ammount).Take(10).ToList();
            }

            return list;
        }
    }

Первая часть работает так, как должно быть. Второй даже не вызывает метод сервера. Вы можете ясно видеть, что это почти тот же код. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 14 января 2019

Параметры маршрута передаются через ?param=value. Ваш первый случай работает только потому, что шаблон asp.net добавляет карту маршрутов по умолчанию, которая выглядит примерно так:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Что определяет, что каждый метод Action, для которого определен параметр id, автоматически сопоставляется с: myurl/action/<id>.

Чтобы ваш второй случай сработал, вы должны вызвать действие так:

апи / элемент / GetTop10Items? Тип = что-то

где вы явно определяете параметр маршрута type и его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...