Xar*_*mer 5 c# web-services asp.net-web-api
我是 C# 新手。我尝试使用 int 创建邮政服务。所有获取和发布服务都工作正常。
但是当我将参数传递给后期服务时,它始终为空。但创建一个类后它工作正常。我们可以直接将 int 传递给 service 还是我们必须为其创建一个模型类?
[System.Web.Http.HttpPost]
public IHttpActionResult GetUserByID(int id)
{
var user = userList.FirstOrDefault((p) => p.Id == id);
if (user== null)
{
return NotFound();
}
return Ok(user);
}
Run Code Online (Sandbox Code Playgroud)
但它总是发送 0 。但是当我创建一个类并将该 int 添加为属性时,它工作正常。
工作代码
[System.Web.Http.HttpPost]
public IHttpActionResult GetUserByID(data id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok();
}
public class data
{
[Required]
public int id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编辑
我的标题准确吗?
我认为你需要添加[FromBody]到参数:
[System.Web.Http.HttpPost]
public IHttpActionResult GetUserByID([FromBody]int id)
{
var user = userList.FirstOrDefault((p) => p.Id == id);
if (user== null)
{
return NotFound();
}
return Ok(user);
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,Web API 使用以下规则绑定参数:
- 如果参数是“简单”类型,Web API 会尝试从 URI 获取值。简单类型包括 .NET 基元类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及带有可以从字符串转换的类型转换器的任何类型。
- 对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。
它接着说:使用 [FromBody]
要强制 Web API 从请求正文中读取简单类型,请将 [FromBody] 属性添加到参数中
更新 - 开始[HttpPost]工作......
正如@Shahbaz 下面建议的那样,请确保您已将Content-Type标头设置为application/json,否则您将收到错误消息:
此资源不支持请求实体的媒体类型“文本/纯文本”。
另外,请确保您仅id在请求正文中发布,例如1,而不是将包装在 JSON 对象中的 id 作为键/值对发布{ "id": "1" }。
[HttpGet]最后- 考虑使用......
值得指出的是,因为您现在只是发送一条int来获取一条记录,即使您可以使用它来工作[HttpPost],最好还是将其更改为[HttpGet]语义上正确的 - 您正在获取一条用户记录,并且不要实际上根本不需要发布任何内容。所以这样的事情可能会更好:
[System.Web.Http.HttpGet]
[Route("api/users/{id}")]
public IHttpActionResult GetUserByID(int id)
{
var user = userList.FirstOrDefault((p) => p.Id == id);
if (user== null)
{
return NotFound();
}
return Ok(user);
}
Run Code Online (Sandbox Code Playgroud)
然后将您的id请求 URL 放入,例如:
https://yourdomain/api/users/1
Run Code Online (Sandbox Code Playgroud)
上面的示例使用属性路由,它可以帮助您创建自己的自定义 URL 来定位您自己的 API 操作方法。
| 归档时间: |
|
| 查看次数: |
5258 次 |
| 最近记录: |