ASP.NET Web APi - 将对象作为参数传递
本文关键字:对象 参数传递 NET Web APi ASP | 更新日期: 2023-09-27 18:30:32
用户控制器中的MakeUser方法,用于创建用户名和密码。
[HttpGet]
public string MakeUser(UserParameters p)
{
const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string pass = "";
Random r = new Random();
for (int i = 0; i < p.Number; i++)
{
pass += chars[r.Next(0, 62)];
}
string firstTwoo = p.Name.Substring(0, 2);
string firstThree = p.Surname.Substring(0, 3);
return "Your username is: " + firstTwoo + firstThree + "'nYour password is: " + pass;
}
类,用于将参数作为对象发送。
public class UserParameters
{
public int Number { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
控制台客户端中的运行异步方法。我可以使用 Get 方法传递对象吗?如果是,我在这里犯了什么错误?谢谢!
static async Task RunAsync()
{
using (var client = new HttpClient())
{
var p = new UserParameters();
Console.Write("Your username: ");
p.Name = Console.ReadLine();
Console.Write("Your surname: ");
p.Surname = Console.ReadLine();
Console.Write("Please type a number between 5 and 10: ");
p.Number = int.Parse(Console.ReadLine());
client.BaseAddress = new Uri("http://localhost:4688/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//HTTP GET
HttpResponseMessage response = await client.GetAsync("api/user?p=" + p);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsAsync<UserParameters>();
Console.WriteLine("'n*****************************'n'n" + result);
}
}
}
GET
请求不支持以这种方式传递对象。唯一的选择是将其作为查询字符串参数执行,正如其他人已经证明的那样。从设计的角度来看,由于您正在创建新资源,因此将其作为POST
或PUT
请求更有意义,两者都允许实际有效负载与请求一起发送。
[HttpPost]
public string MakeUser([FromBody]UserParameters p)
{
...
}
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
var response = await client.PostAsJsonAsync(new Uri("http://localhost:4688/"), p);
// do something with response
变量 p 不能像您拥有它一样作为查询字符串参数传递。若要按照您喜欢的方式填充 url 和查询字符串,您必须写出查询字符串的其余部分,并在构建字符串时访问对象的属性。
string queryString = "api/user?name="+p.Name+"&surname="+p.Surname+"&number="+p.Number;
HttpResponseMessage response = await client.GetAsync(queryString);
MakeUser() 方法需要类似于以下内容:
[HttpGet]
public string MakeUser(string name, string surname, int number)
{
}
但是我没有看到您在哪里调用 MakeUser() 方法。也许在查询字符串参数中,您需要将其设置为"api/makeuser?
你可以随心所欲地传递 p 参数,这完全没问题,看看这里的 FromUri 段落,其中对象用作参数:
https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
该方法将对象作为参数,而不是单个成员。不过,您可以通过指定成员来调用它。