gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:27:38 25 4
gpt4 key购买 nike

我正在制作一个应用程序,它将托管数据库并通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com