Web Api参数始终为空
为什么当我用下面的ajax调用下面的Post方法时,参数总是为空?
public IEnumerable<string> Post([FromBody]string value) { return new string[] { "value1", "value2", value }; }
以下是通过ajax调用Web API方法:
function SearchText() { $("#txtSearch").autocomplete({ source: function (request, response) { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "api/search/", data: "test", dataType: "text", success: function (data) { response(data.d); }, error: function (result) { alert("Error"); } }); } }); }
$.ajax({ url: '/api/search', type: 'POST', contentType: 'application/x-www-form-urlencoded; charset=utf-8', data: '=' + encodeURIComponent(request.term), success: function (data) { response(data.d); }, error: function (result) { alert('Error'); } });
基本上,你可以只有一个标量types的参数,用[FromBody]
属性装饰,你的请求需要使用application/x-www-form-urlencoded
,POST有效载荷应该是这样的:
=somevalue
请注意,与标准协议相反,参数名称缺失。 您只发送价值。
您可以阅读更多关于Web Api中的模型绑定在this article
工作原理。
但是,当然,这种黑客入侵是一件有病的事情。 你应该使用视图模型:
public class MyViewModel { public string Value { get; set; } }
然后摆脱[FromBody]
属性:
public IEnumerable<string> Post(MyViewModel model) { return new string[] { "value1", "value2", model.Value }; }
然后使用JSON请求:
$.ajax({ url: '/api/search', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify({ value: request.term }), success: function (data) { response(data.d); }, error: function (result) { alert('Error'); } });
对于JSON内容types的[FromBody]
属性,不能使用简单的types。 虽然Visual Studio中的默认string是来自body的string,但是这是针对application / x-www-form-urlencoded内容types的。
将string值作为属性放在基本模型类上,反序列化器将工作。
public class SimpleModel() { public string Value {get;set;} } public IEnumerable<string> Post([FromBody]SimpleModel model) { return new string[] { "value1", "value2", model.Value }; }
更改您要发送的JSON:
{"Value":"test"}
无论何时我们调用web api动作,并且从[body]参数中input参数前缀=例如
public string GetActiveEvents([FromBody] string XMLRequestString) { }
调用上面的web api动作
-
URI
2。
用户代理:提琴手
内容types:application / x-www-form-urlencoded
主机:localhost:54702
内容长度:936
- 请求正文=数据
我希望这会给出清晰的想法。
我刚刚和这个.NET Core Web API有过一段时间。 所以希望能够节省时间:对于我来说,实际的问题很简单 – 我没有转换成正确的types(注意,@达林斯答案使用虚拟机而不是string)。
模板中的默认types是string
。 我以为因为我们发送string化的JSON,我们会看到一个JSONstring,但事实并非如此。 我必须把它做成正确的types。
例如,这失败了
[EnableCors("AllowAll")] [HttpPost] public HttpResponseMessage Post([FromBody]string value) { // Do something with the blog here.... var msg = new HttpResponseMessage(System.Net.HttpStatusCode.OK); return msg; }
但是,这工作。
[EnableCors("AllowAll")] [HttpPost] public HttpResponseMessage Post([FromBody]Blog value) { // Do something with the blog here.... var msg = new HttpResponseMessage(System.Net.HttpStatusCode.OK); return msg; }
Ajax调用
function HandleClick() { // Warning - ID's should be hidden in a real application // - or have covering GUIDs. var entityData = { "blogId": 2, "url": "http://myblog.com/blog1", "posts": [ { "postId": 3, "title": "Post 1-1", "content": "This is post 1 for blog 1", "blogId": 2 }, { "postId": 4, "title": "Post 1-2", "content": "This is post 2 for blog 1", "blogId": 2 } ] }; $.ajax({ type: "POST", url: "http://localhost:64633/api/blogs", async: true, cache: false, crossDomain: true, data: JSON.stringify(entityData), contentType: "application/json; charset=utf-8", dataType: "json", success: function (responseData, textStatus, jqXHR) { var value = responseData; }, error: function (responseData, textStatus, errorThrown) { alert('POST failed.'); } }); }