我有以下控制器:
public class ValuesController : ApiController
{
// POST api/values
public IHttpActionResult Post(string filterName)
{
return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
}
WebApi配置
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
我使用这个js代码来调用api
$.ajax(
{
url: "/api/values/",
type: "POST",
dataType: 'json',
data: { filterName: "Dirty Deeds" },
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
console.log(err);
}
});
我得到405方法不允许(发布)
答案 0 :(得分:30)
C#
public class ValuesController : ApiController
{
// POST api/values
[HttpPost] // added attribute
public IHttpActionResult Post([FromBody] string filterName) // added FromBody as this is how you are sending the data
{
return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
的JavaScript
$.ajax(
{
url: "/api/Values/", // be consistent and case the route the same as the ApiController
type: "POST",
dataType: 'json',
data: "=Dirty Deeds", // add an = sign
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
console.log(err);
}
});
因为您只发送一个值,所以在它前面加上=符号,这样它就会被视为表格编码。如果您想清楚这是您正在对ajax调用进行的操作,也可以添加内容类型。
contentType: 'application/x-www-form-urlencoded'
或者您也可以通过URL发送内容或将内容包装在服务器上的对象以及ajax调用中并对其进行字符串化。
public class Filter {
public string FilterName {get;set;}
}
public class ValuesController : ApiController
{
// POST api/values
[HttpPost] // added attribute
public IHttpActionResult Post([FromBody] Filter filter) // added FromBody as this is how you are sending the data
{
return new JsonResult<string>(filter.FilterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
的JavaScript
$.ajax(
{
url: "/api/Values/", // be consistent and case the route the same as the ApiController
type: "POST",
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({FilterName: "Dirty Deeds"}), // send as json
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
console.log(err);
}
});
答案 1 :(得分:8)
将[FromBody]
添加到API方法签名中,如public IHttpActionResult Post([FromBody]string filterName)
,并使用引号包装ajax数据参数:data: '"' + bodyContent + '"'
。
不是很直观,但确实有效。
答案 2 :(得分:0)
将[HttpPost]属性添加到控制器
中的方法