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

时间:2017-01-06 17:14:16

标签: c# angularjs typescript asp.net-web-api

我有一个用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]告诉我的后端不要引用指向后端的网址,而是搜索正在发送给它的内容?是对的吗?我认为我不能很好地解释我朦胧的理解。

我的更多,在标题中或多或少地概述了这个问题,并且:在我的后端使用[FromBody]属性来修复我的404良好实践,还是更像是一个黑客解决方案?

感觉这对解决方案来说太容易了,我担心如果整体上它是一个非优雅的解决方案,我只是在一个更严重的问题上打了一个快速解决方案。例如,没有正确配置我的前端或后端API以便彼此同步工作。

2 个答案:

答案 0 :(得分:2)

你的类型脚本正在发帖,并在正文中发送id这就是为什么你有404,你应该改变打字稿来做一个得到并留下后端,你不需要请求的正文,所以get应该没问题(在get调用的url中发送id)。 或者最佳实践是删除操作实际上是DELETE http请求,更符合REST,因此您需要使用HttpDelete标记后端方法并更改类型脚本以执行删除http请求。 我建议第二种选择。

答案 1 :(得分:2)

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

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

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

使用属性路由[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)