>我有这个弹簧控制器:
@RequestMapping(value = "/create")
@ResponseBody
public ResponseEntity<?> create(
@RequestParam String name,
@RequestParam Integer startYear,
@RequestParam Integer endYear,
@RequestParam(required=false) MultipartFile polygons,
@RequestParam(required=false) Long reference
)
是否可以通过 POST 请求从 Angular 发送这些参数?
我正在尝试这个:
public createExperiment(): Observable<any> {
const headers = new HttpHeaders({'Content-Type': 'application/json'});
return this.http.post(this.backUrl + 'puerto/create', {name:'name'}, {headers: headers})
.map((res: any) =>
res
);
}
但是我已经收到此错误:
错误 : {时间戳:1527665099011,状态:400,错误:"错误请求",异常:"org.springframework.web.bind.MissingServletRequestParameterException",消息:"必需的字符串参数'name'不存在",...}
为什么我会收到此错误? 如果我修复了这个问题,我也可以发送多部分文件吗?
我知道我可以解决这个问题,更改控制器并通过 ResquestBody 接收参数,但我想单独发送参数。
当你有URL参数时会使用@RequestParam
。
http.post(url, null, { headers: headers, params: new HttpParams().set('name', 'fer') })
这将发送名称以及网址,如http://abcd.com/a/b?name=fer
如果要将其作为帖子正文发送,请在弹簧代码中定义一个模型,并在弹簧控制器中使用@RequestBody
注释。
看这里的例子。
它使用 formData 和 ('Content-Type', 'multipart/form-data'(;
public createExperimentService(formData: FormData): Observable<any> {
const headers = new HttpHeaders();
headers.append('Content-Type', 'multipart/form-data');
return this.http.post(this.backUrl + 'puerto/create', formData, {headers: headers})
.map((res: any) =>
res
);
}
formData: FormData = new FormData();
createExperiment() {
this.formData.append('name', this.nameExperiment);
this.formData.append('startYear', this.startYear);
this.formData.append('endYear', this.endYear);
this.formData.append('reference', this.reference);
this.createExperimentService(this.formData).subscribe(res => {
console.log(res);
});
}
//This method loads a file
fileChange(event) {
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
const file: File = fileList[0];
this.formData.append('polygons', file, file.name);
}
}