c# - 带字符串参数的 HttpClient GET 方法

标签 c# asp.net asp.net-mvc http asp.net-web-api

我正在制作一个应用程序,它将托管数据库并通过 Web API 与网站和 wpf 应用程序进行通信。那么,问题是:如何使用字符串参数发出 GET 请求?我已经做过类似的事情,但是使用整数参数。几乎相同的代码不适用于字符串参数。为什么?

使用 int 参数的代码: Controller 方法:

[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;
        }
    }

第一部分按应有的方式工作。第二个甚至不调用服务器方法。您可以清楚地看到它几乎是相同的代码。我在这里缺少什么?

最佳答案

路由参数通过?param=value传输。您的第一个案例之所以有效,是因为 asp.net 模板添加了一个默认路由映射,如下所示:

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

这定义了每个具有参数 id 的 Action 方法已定义,自动映射到:myurl/action/<id> .

要使第二个案例起作用,您必须像这样调用操作:

api/item/GetTop10Items?type=something

在其中显式定义路由参数 type及其值(value)。

关于c# - 带字符串参数的 HttpClient GET 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180220/

相关文章:

c# - 在 C# 中开始使用返回的 DataRow 类型的推荐方法是什么?

asp.net - 使用另一种身份验证方法进行外部 api 调用

c# - 对基类的派生类进行序列化和反序列化

c# - 我应该在这里使用 static 吗?

c# - Option<T> 集合的功能转换

css - Asp.Net 设置不同的 css 类来生成 Datalist 中的元素

c# - 使用 HtmlAgilityPack 设置文本区域值

c# - "ViewModel Behavior"的定义是什么?

c# - 如何将包含字符串的 jQuery 对象绑定(bind)到 List<string>?

c# - 授权属性意外工作