无法使用Angular反应形式发送多部分请求

时间:2019-10-22 19:24:39

标签: angular multipartform-data angular-reactive-forms reactive-forms

我的Java后端API希望对Angular前端上的表单进行多部分POST请求,该请求当前正在使用反应式表单。端点看起来像这样:

  @PostMapping("/submit")
  public ResponseEntity<?> submit(
      @RequestParam String requester,
      @RequestParam String subject,
      @RequestParam String description,
      @RequestParam String htmlBody,
      @RequestParam String customFieldValues,
      @RequestParam List<MultipartFile> attachments) {

    return myBackendService.submitToZendesk(
        requester, subject, description, htmlBody, customFieldValues, attachments);
  }

Angular组件中的提交功能如下所示(当前使用伪造的表单数据):

  public onSubmit(): void {
    const formData = new FormData();
    formData.append('requester', 'ryan');
    formData.append('subject', 'Test Subject',);
    formData.append('description', 'test desc',);
    formData.append('htmlBody', '',);
    formData.append('customFieldValues', 'test');
    this.frontendService.submitForm(formData).subscribe(
      res => console.log(res),
      err => this.onHandleError(err)
    );
  }

服务:

  public submitForm(payload: any): Observable<any> {
    return this.resourceService.submitForm(payload)
  }

最后是资源服务:

  public submitShippingAuth(payload: ShippingAuthRequest): Observable<any> {
    const url = `${environment.api}/submit`
    return this.http.post(`${url}`, payload)
      .pipe(map(this.extractResponse), catchError(this.handleError))
  }

我在帖子中收到400状态代码:

error: "Bad Request"
message: "Required String parameter 'requester' is not present"
path: "/v1/submit"
status: 400
timestamp: 1571771034002
trace: "org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'requester' is not present

但是我的请求有效载荷肯定似乎具有表单数据:

------WebKitFormBoundaryTIuEnyoDjbqZHnFA
Content-Disposition: form-data; name="requester"

ryan
------WebKitFormBoundaryTIuEnyoDjbqZHnFA
Content-Disposition: form-data; name="subject"

Test Subject
------WebKitFormBoundaryTIuEnyoDjbqZHnFA
Content-Disposition: form-data; name="description"

test desc
------WebKitFormBoundaryTIuEnyoDjbqZHnFA
Content-Disposition: form-data; name="htmlBody"


------WebKitFormBoundaryTIuEnyoDjbqZHnFA
Content-Disposition: form-data; name="customFieldValues"

test
------WebKitFormBoundaryTIuEnyoDjbqZHnFA--

有人知道我在做什么错吗? Postman中的表单数据POST起作用。

2 个答案:

答案 0 :(得分:0)

要打印请求者的行应包含逗号(,),如下所示 formData.append('requester','ryan',);

希望这可以解决您的问题。

答案 1 :(得分:0)

提交功能肯定看起来不错,formData.append中的第三个arg是文件名,因此没有必要。我发现的唯一结果是,您尚未在http post请求中设置标头。我猜您正在使用interceptors这样做,如果没有,请尝试这样做。