为什么使用“表单”与使用“正文”进行POST?

时间:2019-02-15 00:14:55

标签: asp.net angular

标题简洁地表达了我的帖子。尽管下面的旁注表达了我的具体情况,但引发了这个问题。

  

*侧面注:我正在制作一个带有Angular前端的Web应用程序。我发现,一旦我将数据封装到来自   html表单模板,然后我无法从这些值中获取这些值   在客户端Angular中(如该状态所示:   How do i get the content from a formData?   )。虽然当我使用[[FromForm]'属性过帐到ASP.Net时,   值可以很好地映射。

     

为了使事情变得容易,我宁愿从表单中获取数据   首先,然后在“正文” POST(而不是“表单”)中使用它   开机自检这样做是为了使我可以传递直接的数据   而不是用我无法处理的形式包装的数据   客户端。

     

因此,因此,我想知道发布“表格”与   发布“实体”,以及是否有任何理由我应该使用一个   另一个?

     

更新

     

在ASP.Net Core中,可以将属性放在REST终结点的参数类型上。 [FromForm]和[FromBody]是我很好奇的。从角度来看,调用这些REST端点需要传递“ FormData”(对于[FromForm])或某种用户定义的类型(对于[FromBody])。

     

请参见下面的示例。

更新

以下是“ [FromBody]”的ASP.NET端点的签名:

[HttpPost]
public async Task<IActionResult> CreateToken([FromBody] LoginViewModel model) 
{...}

以下是调用此[FromBody]端点的Angular代码段,以及为POST调用传入的类型:

public creds = {
    username: "",
    password: ""
}

login(creds): Observable<boolean> {
return this.http.post("api/account/createtoken", creds)
  .pipe(
    map((data: any) => {
      this.token = data.token;
      this.tokenExpiration = data.expiration;
      this.username = data.username;
      return true;
    }));
}

以下是“ [FromForm]”的ASP.NET端点的签名:

[HttpPost]
public async Task<IActionResult> Signup([FromForm] SignupViewModel viewModel)
{...}

这是称为“ [FromForm]”端点的Angular代码段:

registerUser(formData: FormData) {
    const options = {
      headers: new HttpHeaders().set('Accept', 'application/json')
    };
    return this.http.post('api/account/signup', formData, options)
      .pipe(
      map(() => {
          return true;
        }),
        catchError(this.handleError)
      );
}

1 个答案:

答案 0 :(得分:0)

FromForm属性用于由内容类型application / x-www-url-formencoded发送的提交表单中的传入数据,而FromBody将以默认方式解析模型,在大多数情况下,该格式由内容类型应用程序发送/ json,来自请求正文