在我的后端使用[FromBody]来识别WebAPI参数是一种良好的做法吗



我有一个用angular和TypeScript编写的前端WebAPI,看起来像这样。

removeSubset(id: number): ng.IPromise<any> {
return this.$http.post(this.api + '/DeleteStudySubset', id)
.then(this.returnData);
}
returnData = (response: any) => {
return response.data;
};

它调用的后端版本是这样写的

[HttpPost]
[ResponseType(typeof(IHttpActionResult))]
public async Task<IHttpActionResult> DeleteStudySubset(int id)
{
await _subsetRepo.DeleteStudySubset(id);
return Ok();
}

一开始我得到了一个URI 404错误,我一辈子都搞不清楚。然后我偶然发现了参数绑定[FromBody]属性,并使用它解决了404问题。

因此,后端API被重写为包含属性,看起来像这样的

[HttpPost]
[ResponseType(typeof(IHttpActionResult))]
public async Task<IHttpActionResult> DeleteStudySubset([FromBody] int id)
{
await _subsetRepo.DeleteStudySubset(id);
return Ok();
}

据我所知,[FromBody]是在告诉我的后端不要引用指向后端的url,而是搜索发送给它的内容的正文?是这样吗?我认为我没有很好地解释我模糊的理解。

我的问题或多或少在标题中列出了:在我的后端使用[FromBody]属性来修复我的404良好实践,还是更像是一个破解解决方案?

感觉这是一个太容易的解决方案,我担心总的来说,这是否是一个不优雅的解决方案。我只是在一个更严重的问题上快速解决了这个问题。比如没有正确配置我的前端或后端API,使其彼此同步工作。

您的类型脚本正在执行post,并在body中发送id。这就是为什么您有404,您应该更改类型脚本以执行get并保持后端原样,您不需要请求的body,所以get应该很好(在get调用的url中发送id)。或者最好的做法是,Delete操作实际上是Delete http请求,以更符合REST,因此您需要用HttpDelete标记后端方法,并更改类型脚本来执行删除http请求。我推荐第二种选择。

为了使WebApi RESTful,您应该将路由视为实体的地址,将http谓词视为操作。创建实体时,FromBody只能与动词HttpPost一起使用。

使用属性routing[RoutePrefix()]用路由前缀装饰控制器。如果使用WebApi 2,则应启用属性路由。如果不只是搜索启用属性路由。

[RoutePrefix("api/study-subset")]

使用属性routing[route()]在方法上设置路由。不需要包含[HttpDelete]属性,WebApi将从方法名称中选择Delete关键字。Id将从路由注入到您的方法中。如果您没有在路由中包含id,那么它将被视为查询字符串。

[Route("{id}")]
public async Task<IHttpActionResult> DeleteStudySubset(int id)
{
await _subsetRepo.DeleteStudySubset(id);
return Ok();
}

然后将您的类型脚本更新为

return this.$http.delete(this.api + 'api/study-subset/' + id)

相关内容

最新更新