Post 或将多个项目放在一个请求中

Post or Put multiple items in a single request

是否可以在单个请求中一次 PostPut 多个项目?

来自

GET  /api/books Get all books.

POST /api/books Create a new book.

PUT /api/books/{id} Update an existing book.

POST /api/books Create books.

PUT /api/books  Update books.

假设您有一个名为 Book 的 class,定义为:

public class Book
{
    public string Title { get; set; }

    public string Author { get; set; }
}

现在我们有一个带有 POST 方法的简单 Web.Api 控制器:

public class BooksController : ApiController
{
    [HttpPost]
    [Route("books")]
    public HttpResponseMessage PostBooks([FromBody] IEnumerable<Book> books)
    {
        return Request.CreateResponse(HttpStatusCode.Created);
    }
}

该方法不对数据做任何事情,它纯粹是为了编译和运行。我的第一个属性表明这是一个 POST,第二个属性决定路由,我使用 attribute based routing 因为我更喜欢它,但你可以推出自己的路由规则。

现在 PostBooks 方法接受类型 Ienumerable<Book> 的参数,而不仅仅是类型 Book.

的单个参数

当我现在站起来这个小端点,用下面的url打它:

http://localhost:port/books

并将请求指定为 POST 并在请求正文中提供以下有效负载:

[  
   {  
      "Title":"This is a book",
      "Author":"Joe Bloggs"
   },
   {  
      "Title":"This is a book: The reckoning",
      "Author":"Joe Bloggs"
   }
]

我的断点被击中,Web.API 设法将我的负载反序列化为 books 参数,当它进入 PostBooks 方法时:

同样适用于PUT,唯一需要改变的是属性。

最后我使用了如下代码。

   // Post Multi
    // POST: api/books
    [Route("api/books")]
    [ResponseType(typeof(IEnumerable<Book>))]
    public IHttpActionResult Postbooks(IEnumerable<Book> books)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        foreach (var item in books)
        {
            db.Book.Add(item);
        }

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateException)
        {

            throw;

        }

        return Ok(books);
    }