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

本文关键字:客户端 Http 参数传递 | 更新日期: 2023-09-27 18:37:03

我正在学习使用客户端创建一个 RESTful API,但正在努力将用户输入传递给帖子。我的控制器很好,因为我可以将数据发送到数据库(使用 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上查看了各种不同但相似的问题,但很难理解。我尝试在路线中放置占位符,但也许我实现不正确?(如果这甚至是正确的思考方式!如果有人能帮助我解决这个问题,我将不胜感激。

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

当 Web API 操作参数是字符串等简单类型时,参数绑定机制假定它们来自查询字符串。若要推断值应来自请求正文,只需直接使用 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; }
}