3

我正在使用 Visual Studio 2012 RC。我正在使用默认路由并具有以下 Web API 控制器:

public class FooController : ApiController
{
    // GET api/foo
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/foo/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/foo
    public string Post(string abc)
    {
        Console.WriteLine("value: {0}", abc);
        return "foo" + abc;
    }

    // PUT api/foo/5
    public void Put(int id, string value)
    {
    }

    // DELETE api/foo/5
    public void Delete(int id)
    {
    }
}

我想在 Fiddler 中做一个简单的 POST 测试,所以我有

请求标头
用户代理:提琴手
内容类型:应用程序/json

请求正文
{"abc": "def"}

当我调试请求时,参数 abc 以 null 形式出现,而不是“def”。我的 Fiddler 语法有问题吗?

4

2 回答 2

5

(1) 默认情况下,简单类型取自 URI。要从请求正文中读取简单类型,请将 [FromBody] 属性添加到参数中。

public string Post([FromBody] string abc)

(2) '{"abc": "def"}' 定义了一个具有名为 "abc" 属性的对象 - 要发送 JSON 字符串,请求正文应该只是 "def"

于 2012-08-08T20:31:04.270 回答
0

这个答案来自 ASP.Net Web API 站点上的链接 sent -html-form-data,原来是 Mike 的博客文章(起初我没有意识到这一点)。Web API 团队已经做出了一些与普通 MVC 控制器完全不同的参数绑定决策。

发送“简单类型”的正确语法是

public HttpResponseMessage PostSimple([FromBody] string value)
{
// code goes here

在 Fiddler 中,你把

=def          //THIS CANNOT HAVE QUOTES AND = IS MANDATORY

好的,下面是与 MVC 工作方式非常不同的部分。

  1. 正如 Mike 所说,您必须使用 [FromBody]。
  2. 您只能有 1 个参数。如果您想要超过 1 个参数,您有 2 个选择:i) 使用 url 查询参数,而不是请求正文或 ii) 使用复杂对象(即您自己的类)。
  3. 请求正文应该是一个简单的 =def 并且不能使用命名参数。
于 2012-08-09T14:37:37.807 回答