我使用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上提供的各种解决方案,但我尝试的任何工作都没有,有人可以帮助我吗?
答案 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){...}