ASP.NET Web APi - 将对象作为参数

时间:2016-01-15 20:21:48

标签: c# asp.net asp.net-web-api

用户控制器中的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;
}

用于将参数作为对象发送的UserParameter类。

public class UserParameters
{
    public int Number { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }    
}

控制台客户端中的RunAsync方法。我可以用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);
        }
    }
}

3 个答案:

答案 0 :(得分:8)

GET请求不支持以这种方式传递对象。唯一的选择是将其作为查询字符串参数,就像其他人已经演示过的那样。从设计的角度来看,由于您正在创建新资源,因此它更有意义的是POSTPUT请求,它们都允许将实际有效负载与请求一起发送。< / p>

[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

答案 1 :(得分:4)

您的变量p不能作为查询字符串参数传递,就像您拥有它一样。要以您喜欢的方式填充url和查询字符串,您必须写出查询字符串的其余部分并在构建字符串时访问对象的属性。

C

MakeUser()方法需要类似于以下内容:

string queryString = "api/user?name="+p.Name+"&surname="+p.Surname+"&number="+p.Number;
HttpResponseMessage response = await client.GetAsync(queryString);

我没有看到你在哪里调用MakeUser()方法。也许在查询字符串参数中,您需要将其设为'api / makeuser?'。

答案 2 :(得分:3)

你可以像你想的那样传递p参数,这很好,看看这里的FromUri段落,其中一个对象被用作参数:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

该方法将对象作为参数,而不是单个成员。您可以通过指定成员来调用它。