我想使用以下内容向Web api服务器发出PUT请求。
Angular资源和请求:
Books: $resource('/api/book/:id',
{id: '@id'},
{
'update' : {method: 'PUT'}
})
...
$id = book.BookId
BookLibraryAPI.Books.update({id: $id},book);
Web API控制器:
public void Put(int id, string book)
{
}
但我得到405错误,包含以下标题:
Request URL:http://localhost:53889/api/book/1009
Request Method:PUT
Status Code:405 Method Not Allowed
...
我尝试了很多东西,但我仍然找不到问题。
整个控制器:
[授权] public class BookController:ApiController { BusinessBundle _bundle = new BusinessBundle();
// GET api/book
public IEnumerable<Book> Get()
{
return _bundle.BookLogic.GetAll();
}
// GET api/book/5
public Book Get(int id)
{
return _bundle.BookLogic.GetBook(id);
}
// POST api/book
public void Post([FromBody]string value)
{
}
// PUT api/book/5
public void Put(int id, string book)
{
var a = book; // just for testing
}
// DELETE api/values/5
public void Delete(int id)
{
}
答案 0 :(得分:1)
有些东西让我觉得很奇怪,在.js你正在做以下事情:
$id = book.BookId
BookLibraryAPI.Books.update({id: $id},book);
这意味着这本书是一个“复杂”的对象,但在cs控制器部分,你会收到一本书作为字符串:
// PUT api/book/5
public void Put(int id, string book)
{
var a = book; // just for testing
}
首先,book
不能是一个字符串,因为你发送的是一个完整的对象。在最坏的情况下,它可以是通用对象类型,最好它应该是一个类完全与从角度部分发送的成员相同的成员。
所以我的建议是创建一个类来匹配您从javascript发送的book
参数。
ps:asp.net控制器上的Put()
确实会出现与上述评论中建议相反的情况。