【问题标题】:Pass parameters to C# Http client post将参数传递给 C# Http 客户端帖子
【发布时间】:2016-06-16 01:11:30
【问题描述】:

我正在学习使用客户端创建 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 上查看了各种不同但相似的问题,但很难理解。我曾尝试在路线中放置占位符,但也许我实施不正确? (如果这甚至是正确的思考方式!)如果有人可以帮助我解决这个问题,我将不胜感激。

【问题讨论】:

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


    【解决方案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; }
    }
    

    【讨论】:

    • 嗨,托德,感谢您的回复。我试图实施你所说的,但无济于事。无论如何,我不确定这是(最大的!)问题。即使我在客户端硬编码新帖子并将其传递给 PostAsJsonAsync,我也会收到错误消息。这是一个套接字错误异常:“System.Net.Http.HttpRequestException:发送请求时发生错误。---> System.Net.WebException:无法连接到远程服务器---> System.Net.Sockets .SocketException: 无法建立连接,因为目标机器主动拒绝它 127.0.0.1:23226\r\n...等
    • 这是一个网络问题,如果您搜索该异常消息,您会发现不乏结果,例如 this one。虽然我相信我建议的修复也需要让这个工作正常。
    • 再次感谢托德,最后简单的错字 - 端口号错误。是的,我现在已经实施了您的建议,并且我的帖子正在运行。
    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多