AJAX将多个参数传递给WebApi

AJAX请求:

$.ajax({ url: url, dataType: 'json', type: 'Post', data: {token:"4", feed:{"id":0,"message":"Hello World","userId":4} } }); 

服务器端Web API:

  [HttpPost] public HttpResponseMessage Post(string token, Feed feed) { /* Some code */ return new HttpResponseMessage(HttpStatusCode.Created); } 

错误代码404:{“message”:“找不到与请求URI匹配的HTTP资源’localhost:8080 / api / feed’。”,“messageDetail”:“在控制器’Feed’上找不到与之匹配的操作请求。”}

为什么我收到此错误以及为什么我无法将多个参数POST到我的API?

首先编写视图模型:

 public class MyViewModel { public string Token { get; set; } public Feed Feed { get; set; } } 

您的控制器操作将作为参数:

 [HttpPost] public HttpResponseMessage Post(MyViewModel model) { /* Some code */ return new HttpResponseMessage(HttpStatusCode.Created); } 

最后调整你的jQuery调用将其作为JSON发送:

 $.ajax({ url: url, type: 'POST', contentType: 'application/json', data: JSON.stringify({ token: '4', feed: { id: 0, message: 'Hello World', userId: 4 } }) }); 

AJAX调用需要注意的重要事项:

  • 将请求contentType设置为application/json
  • 将数据包装在JSON.stringify函数中以有效地将javascript对象转换为JSON字符串
  • 删除了无用的dataType: 'json'参数。 jQuery将自动使用服务器发送的Content-Type响应头来推断如何解析传递给success回调的结果。

试试这个服务器端(从内存中你只能有一个FromBody参数,所以它需要包含所有的传入属性):

 public class TokenAndFeed { public String token {get; set;} public Feed feed {get; set;} } public HttpResponseMessage Post([FromBody]TokenAndFeed tokenAndFeed) { /* Some code */ return new HttpResponseMessage(HttpStatusCode.Created); } 

我最近遇到了类似的问题,这里有一些关于我如何解决它的信息。 我认为问题与WebApi如何处理参数有关。 你可以在这里和这里阅读一下它,但基本上有两种方法可以在体内或uri中发布参数。 正文只能包含一个参数,但它可以是一个复杂的参数,而uri可以包含任意数量的参数(最多为uri字符限制),但它们必须简单。 当jquery执行POST ajax调用时,它会尝试传递正文中的所有数据参数,这在您的情况下不起作用,因为正文只能有一个参数。

在代码方面,我认为你需要这样的东西:

 var token = "4"; var feed = {Id:0, Message:"Hello World", UserId:4}; $.ajax({ url: "/api/Feed/?token=" + token, dataType: 'json', type: 'Post', data: JSON.stringify(feed) }); 

希望有所帮助。

你可以发布你的Feed类,只是为了确保匹配。

 var data = { token: "4", feed: {Id:0,Message:"Hello World",UserId:4} } $.ajax({ url: "/api/Feed/", dataType: 'json', type: 'Post', data: JSON.stringify(data) }); 

试试这个。 你必须从body获取json对象数据。 读取请求的输入streem并将其映射到您的数据模型。

 public class TokenAndFeed { public string Token { get; set; } public Feed Feed { get; set; } } [HttpPost] public HttpResponseMessage Post() { System.IO.Stream str; String jsonContents; Int32 strLen, strRead; str = HttpContext.Current.Request.InputStream; strLen = Convert.ToInt32(str.Length); byte[] byteArray = new byte[strLen]; strRead = str.Read(byteArray, 0, strLen); jsonContents = Encoding.UTF8.GetString(byteArray); TokenAndFeed tAndf = JsonConvert.DeserializeObject(jsonContents); // some code here return new HttpResponseMessage(HttpStatusCode.Created); } 

希望这会有所帮助。