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); }
希望这会有所帮助。