我从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开发。请指教。
答案 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]
在此定义控制器中的所有路由应该从哪个开始。