问题 Web API 2 Http Post方法


我很反感没有找到解决这个问题的办法。

我开始使用Web API 2创建一个新的api,但是无法使POST和PUT工作。 Get all和Get单项完美运行。

在任何地方都没有相关文章,我发现的那些文章只与Get和Web API有关,而与Web API 2无关。

任何帮助都可以。

    // POST: api/checkOuts
    [HttpPost]
    [ResponseType(typeof(checkOut))]
    [ApiExplorerSettings(IgnoreApi = true)]
    public async Task<IHttpActionResult> PostcheckOut(checkOut co)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.checkOuts.Add(checkOut);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (checkOutExists(checkOut.id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = checkOut.id }, checkOut);
    }

所以基本上,我只是试图调试方法。

在这个链接中特别失望,因为它涵盖了几乎所有内容,但是ai。 http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing

问候


12121
2017-11-11 14:27


起源

您也可以发布周围的类声明,并在测试时将您的请求类型设置为REST客户端中的HTTP POST吗? - Adrian Thompson Phillips
谢谢,我已根据要求编辑了我的帖子。是的我将它设置为使用Chrome Postman,FireFox RestClient和FireFox Poster进行发布和测试,错误代码405已被返回。 PS!路由不是问题。 - DJJ
有关于在发布WebAPI 2应用程序后对405错误进行故障排除的文章,我不确定是否提供任何帮助: http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications - Adrian Thompson Phillips
我现在已经测试了这个并且仍然没有运气,至少我现在对405错误有了更好的理解。 - DJJ


答案:


这是一个有效的代码

        // POST api/values
        [HttpPost]
        [ResponseType(typeof(CheckOut))]
        public async Task<IHttpActionResult> Post([FromBody] CheckOut checkOut)
        {
            if (checkOut == null)
            {
                return BadRequest("Invalid passed data");
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.checkOuts.Add(checkOut);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (checkOutExists(checkOut.id))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = checkOut.Id }, checkOut);
        }

我已经宣布CheckOut类是这样的:

public class CheckOut
{
   public int Id { get; set; }
   public string Property2 { get; set; }
}

这里的关键是:

1-您需要将[FromBody]添加到Api方法中。 2-我用Fiddler测试过,     我通过选择POST动作。     ii- content-type:application / json。     iii-在消息正文中传递{“Id”:1,“Property2”:“Anything”}。

希望有所帮助。


16
2017-11-16 10:21



谢谢,但我仍然得到相同的405错误。我不确定它是否与环境有关或者是什么,因为我创建了一个新的API项目并且仍然存在相同的问题 - DJJ
您是否希望我向您发送我测试过的项目?我可以和你分享。 - Omar.Alani
谢谢,将不胜感激。 - DJJ
您可以从此链接下载项目文件 dropbox.com/s/2727kx7f61dr8cn/WebApi2Test.zip?dl=0 - Omar.Alani
知道了谢谢 - DJJ