我正在学习使用客户端创建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上查看了各种不同但相似的问题,但很难理解。我试过在路线中放置占位符但是我可能错误地实现了它? (如果这是正确的思考方式,那就是这样!)如果有人能帮我解决这个问题,我将不胜感激。
答案 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; }
}