Web API Put - 传递的参数为null

时间:2016-06-07 16:00:39

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

我使用Postman测试我编写的PUT Web API方法,但无论我尝试什么,我传递的强类型参数(MyModel)始终为null。

控制器操作

[Route("api/myapiname/{id}/{name}")]
[HttpPut]
public HttpResponseMessage Put(int id, string name, MyModel mymodel)
{
  *//Do stuff*
}

MyModel类

public class MyModel
{
    public MyModel() { }

    private Boolean _b;
    public Boolean b { set { _b = value; } get { return _b; } }

    private String _comments;
    public String comments { set { _comments = value; } get { return _comments;              }}
}

网址

http://localhost:37781/api/myapiname/123456/laura

邮差

PUT: URL above

Headers: 
Content-Type: application/json

Body:
{
"MyModel":[{"b": true,"comments": "Comments go here"}]
}

我尝试更改此行:

public HttpResponseMessage Put(int id, string name, MyModel mymodel)

public HttpResponseMessage Put(int id, string name, [FromBody]MyModel mymodel)

并将Postman上的内容类型更改为x-www-form-urlencoded,我也尝试更改传递给的内容:     = [{" b":true,"评论":"评论到这里"}]

我已尝试过在StackOverflow上提供的各种解决方案,但我尝试的任何工作都没有,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

当操作期望单个MyModel对象时,您的邮递员请求正在显示正文中具有数组属性的对象或请求。

以下是与您的示例操作匹配的请求的原始代码段:

PUT /api/myapiname/123456/laura HTTP/1.1
Host: http://localhost:37781
Content-Type: application/json
... 
Content-Length: 42

{"b": true,"comments": "Comments go here"}

此操作:

[Route("api/myapiname/{id}/{name}")]
[HttpPut]
public HttpResponseMessage Put(int id, string name, MyModel mymodel){...}

应该符合上述要求。

注意

  

要强制Web API从请求正文中读取简单类型,请添加    [FromBody] 属性参数。

邮递员请求中的Json会解析为这样的对象......

public class MyObject {
    public MyModel[] MyModel {get; set;}
}

因此,您需要更改请求以匹配您定义的操作,或更改您的操作以匹配请求

[Route("api/myapiname/{id}/{name}")]
[HttpPut]
public HttpResponseMessage Put(int id, string name, MyObject mymodel){...}