Web API具有简单POST的空参数

时间:2014-05-09 16:46:12

标签: c# asp.net asp.net-mvc asp.net-web-api

我正在尝试使用Microsoft的Web API调用端点。尝试POST一个简单的字符串值时,我遇到了一个问题。这是API控制器方法。

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] string searchTerm)
{
    // Code ommited for brevity.
}

问题是searchTerm变量是null。这是来自Fiddler的POST的原始视图:

POST http://localhost:51889/search HTTP/1.1
Host: http://localhost:51889
Connection: keep-alive
Content-Length: 15
Cache-Control: no-cache
Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36
Postman-Token: 4fc51a0c-48ca-a1cd-3df8-70155c3cb5fc
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

searchTerm=dogs

我正在使用Postman发送请求。 This StackOverflow user had a similar problem其中一个答案是阅读Rick Strahl's blog post on the topic。 Rick提到我需要包含[FromBody]属性,我确实包含了这个属性。但是,这并不能解决问题。我能做到的唯一办法是创建一个像这样的新类

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] Search term)
{
    // Code ommited for brevity.
}

public class Search
{
    public string Term { get; set; }
}

我宁愿不用像这样的简单类型为每个POST创建新类。我错过了什么吗?我需要更改什么才能使简单类型与我的帖子一起使用而无需创建新类?

4 个答案:

答案 0 :(得分:3)

您只能拥有一个[FromBody]属性的参数。

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] string term, 
                                 [FromBody] string category // this wouldn't work)
{
    // Code ommited for brevity.
}

因此,WebApi希望您拥有密钥:=dogs。 所以如果你用jQuery调用它 - 你需要使用这样的东西:$.post('api/test/search', { '': 'dogs' });

编辑:

资源:

  1. Practical ASP.NET Web API
  2. Parameter Binding in ASP.NET Web API (MSDN)

答案 1 :(得分:0)

尝试使用内容tye作为application / json而不是application / x-www-form-urlencoded 并从post mehtod参数中删除formbody

答案 2 :(得分:0)

您需要确保将值发布为无键,并且只是以=

开头

所以,而不是:

searchTerm=dogs

应该只是

=dogs

答案 3 :(得分:0)

您可以使用如下所示的模型绑定来获取所有参数值 创建viewmodel类如下:

 public class SearchView 
    {
        public string SearchText { get; set; }               
    }

在您的网络API中添加以上视图模型类,如下所示:

[Route("api/Search"), HttpPost]
            public HttpResponseMessage Search(SearchView objSearchView)
            {

将其传递到您的js文件中,如下所示:

var objSearchView = {};
objSearchView.SearchText  = "test";          

$.ajax({
    url: '/api/search',
    type: 'POST',
    contentType: 'multipart/form-data',
    data: data,               
    success: function (response) {
    alert(response);
    },
    error: function (e) {
    alert(e);
    }
});