【问题标题】:Web API Has Null Parameter For Simple POSTWeb API 具有用于简单 POST 的空参数
【发布时间】:2014-05-20 14:54:57
【问题描述】:

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

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

问题是 searchTerm 变量是空的。这是 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 创建新类。我错过了什么吗?我需要进行哪些更改才能让简单类型与我的帖子一起使用,而无需创建新类?

【问题讨论】:

  • 尝试删除[FormBody]并在url上传递搜索词:search?searchTerm=mySearch

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


【解决方案1】:

[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)

【讨论】:

  • 模型活页夹解决了这个问题。 From Body 是完全错误的
  • 如果它完全按照它说的做(将简单类型从 http 正文绑定到 CLR 类型),为什么它是完全错误的?如果我没有指定 [FromBody] - 我会得到 404,因为 WebAPI 默认绑定来自 Uri 的简单类型。
  • 因为 frombody 使用格式化程序并且只允许一个参数
  • 能否提供代码示例 ModelBinder 属性如何解决问题?因为如果我只是将 [FromBody] 更改为 [ModelBinder](来自 System.Web.Http.ModelBinding) - 我会得到 404。
  • Oleksii - 你是对的。我正在考虑我们正在处理的即将到来的代码。不过,我将制作一个示例来启用此场景,并在此处发布。
【解决方案2】:

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

【讨论】:

  • 我将内容/类型更改为 application/json,现在我收到 404 错误“未找到与请求 URI 匹配的 HTTP 资源”。我还删除了 FromBody 属性。
  • 我可以看看你的邮政编码吗?您使用的是表单帖子还是 jquery 帖子?
  • 我正在使用 Postman 发出请求。这是一个 chrome 扩展。
【解决方案3】:

您需要确保发布为无键的值并且它只是以 = 开头

所以,而不是:

searchTerm=dogs

应该只是

=dogs

【讨论】:

    【解决方案4】:

    您可以通过使用模型绑定来获取所有参数值,如下所示 创建如下视图模型类:

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

    在您的 web 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);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多