将参数传递给C#Http客户端帖子

时间:2016-03-02 22:52:33

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

我正在学习使用客户端创建RESTful API,但我正在努力将用户输入传递给帖子。我的控制器很好,因为我可以将数据发送到db(使用Swagger测试),但在客户端,调试器在我的PostAsJsonAsync上给我一个错误。我认为这可能与路由有关。这是我客户的邮政编码:

static async Task AddAsync(ForumPost fp)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:7656/");

            client.DefaultRequestHeaders.Accept
                      .Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP POST
            ForumPost thePost = new ForumPost() { 
                                    Subject = fp.Subject, 
                                    Message = fp.Message};
            HttpResponseMessage response = await client.PostAsJsonAsync("post", thePost);
            if (response.IsSuccessStatusCode)
            {
                Uri uri = response.Headers.Location;
                Console.WriteLine("URI for new resource: " + uri.ToString());
            }
            else
            {
                Console.WriteLine(response.StatusCode + " " + response.ReasonPhrase);
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
        Console.ReadLine();
    }
}

和控制器的相关位

[HttpPost]
// POST: api/Forum
[Route("post")]
public void PostNewMessage (string subject, string message)
{
    if (ModelState.IsValid)
    {
        ForumPost p = new ForumPost(subject, message);
        db.ForumPosts.Add(p);
        db.SaveChanges();
    }
}

我已经在SO上查看了各种不同但相似的问题,但很难理解。我试过在路线中放置占位符但是我可能错误地实现了它? (如果这是正确的思考方式,那就是这样!)如果有人能帮我解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

当您的Web API操作参数是字符串等简单类型时,parameter binding机制假定它们来自查询字符串。要推断值应来自请求正文,只需直接使用ForumPost类作为参数而不是单个字符串值:

[HttpPost]
// POST: api/Forum
[Route("post")]
public void PostNewMessage(ForumPost p)
{
    if (ModelState.IsValid)
    {
        db.ForumPosts.Add(p);
        db.SaveChanges();
    }
}

另请注意,ForumPost需要无参数构造函数,以便框架知道如何创建实例。像这样定义你应该是好的:

public class ForumPost 
{
    public string Subject { get; set; }
    public string Message { get; set; }
}