Web API中的PUT将始终放置" 0"到服务器

时间:2017-02-13 13:17:00

标签: c# asp.net-web-api2 put asp.net-web-api-routing

我从Web API开始(我已经离开了web dev一段时间了,而且似乎没人关心SOAP了),但是在尝试PUT时遇到了一些麻烦。

我遵循了在线教程,它适用于GET和DELETE。为了测试,我使用Postman,因为这将从另一个服务调用,该服务也使用Postman进行测试。这是GET的代码:

获取所有书籍:

// GET: api/Books
public IEnumerable<Book> Get()
{
    return Library.Books;
}

按ID获取书籍:

// GET: api/Books/<int>
public IHttpActionResult Get(int id)
{
    Book book = Library.Books.FirstOrDefault(l => l.ID == id);

    if (book != null)
        return ResponseMessage(Request.CreateResponse<Book>(HttpStatusCode.OK, book));
    else
        return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found."));
}

按ID删除图书:

// DELETE: api/Books/<int>
public IHttpActionResult Delete(int id)
{
    Book book = Library.Books.FirstOrDefault(l => l.ID == id);

    if (book != null)
    {
        Library.Books.Remove(book);
        return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK));
    }
    else
        return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found."));
}

所有这些都运行正常并且将满足我的目的,因为我必须返回一个对象列表,所以它一切都很好。

BTW,http://localhost/api/Books/1在选择GET或DELETE时效果很好(我现在不需要进入邮递员的内部工作)

但是我改变了PUT方法,因为我只需要向这个服务发送一些int(一个地址)。这是测试代码:

// PUT: api/Books/<int>
public IHttpActionResult Put([FromBody]int address)
{
    if (address == 0)
        return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.BadRequest, "Value cannot be zero"));
    else
        return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK));
}

调试时,参数&#34;地址&#34;如果这样调用将始终为零:http://localhost/api/Books/80或任何其他int。换句话说,我对PUT的反应总是&#34;价值不能为零&#34;。我尝试删除[FromBody]并将[HttpPut]属性添加到PUT方法,但这只会让事情变得更糟。我知道这很新鲜,但就像我说的那样,我几乎没有处理过web开发。请指教。

1 个答案:

答案 0 :(得分:4)

您拥有的代码:

public IHttpActionResult Put([FromBody]int address)
{
}

期待您发送包含该号码的请求正文。

在REST API中,PUT动词通常以这样的方式实现:

public IHttpActionResult Put(int id, [FromBody]Book book)
{
    //Update book with id == id with info from book
}

然后,您可以使用请求正文向http://myapi.com/api/Books/23发送HTTP请求,如:

{
    "title": "Updated title",
    "author": "Updated author"
}

编辑:

实际上这一切只是典型的模式。如果您愿意,您可以进行基于属性的路由并实现您想要的目标:

[RoutePrefix("api/Books")]
public class BooksController : ApiController
{
    [HttpPut]
    [Route("{address}")]
    public IHttpActionResult Put(int address)
    {

    }
}

在这种情况下,您使用基于属性的路由来定义操作的路由。 [RoutePrefix]在此定义控制器中的所有路由应该从哪个开始。