【问题标题】:Angular 10 | Http post | String array append FormData角 10 |发帖 |字符串数组追加FormData
【发布时间】:2020-09-15 20:59:20
【问题描述】:

我必须向 api 端点发出 post 请求,但我收到错误状态 500。

name: "HttpErrorResponse"
ok: false
status: 500
statusText: "Internal Server Error"

这是我的代码:

var selectedIds = ["31"];
let sendData = new FormData();
sendData.append('auth', this.dataService.REG_AUTH);
sendData.append('identifier', identifier);
sendData.append('selected[]', selectedIds); 

this.http.post<any>('APIENDPOINT', sendData).subscribe(data => {
  console.log(data);
}, error => {  
  console.log(error);
});

问题出在这一行:sendData.append('selected[]', selectedIds); 我不知道如何将数组传递给 FormData。

这是来自我们的 android 应用程序的一个工作示例。我需要将此请求转换为 angular/typescript 语法:

@JvmSuppressWildcards
@FormUrlEncoded
@POST("APIENDPOINT")
fun addData(
    @Field("auth") auth: String,
    @Field("identifier") identifier: String,
    @Field("selected[]") selected: ArrayList<String>
): Call<ResponseBody>

到目前为止我所知道的:

似乎 angular 不会序列化数据,所以我尝试了一些硬编码修复,但这些都不起作用:

sendData.append('selected%5B%5D', '%2231%22'); 
sendData.append('selected%5B%5D', '31');
sendData.append('selected%5B%5D', 31);
sendData.append('selected%5B%5D', '%5B%2231%22%5D'); 
sendData.append('selected%5B%5D', selectedIds); 
sendData.append('selected%5B%5D', JSON.stringify(selectedIds));

如果我使用selected 而不是selected[],则不会出错,但显然没有更新数据,所以我很确定这是一个序列化/解析问题。

【问题讨论】:

    标签: javascript angular typescript http post


    【解决方案1】:

    来自this answer

    FormData 的 append() 方法只能接受 string 或 blob 的对象 类型。如果需要追加数组,请使用 JSON.stringify() 方法 将您的数组转换为有效的 JSON 字符串。

    formData.append('selected[]', JSON.stringify(selectedIds));
    

    【讨论】:

    • 我明白了:selected[]: ["31"]
    • 能否请您检查其他表单数据值?这很奇怪。如果您只附加该单个值会发生什么?
    • 问题确实出在其他地方。尽管 var 存在,但它是错误的 var。感谢您的帮助和时间。
    【解决方案2】:

    statusCode 500 是内部服务器错误,是服务器端问题。所以,最好检查一下API是否能收到你的请求。

    FormData 的append() 方法接受stringblob 类型所以你可以使用JSON.stringify() 方法(formData.append('selectedIds', JSON.stringify(selectedIds));)。所以试试这个:

    let selectedIds = ["31"];
    let sendData = new FormData();
    sendData.append('auth', this.dataService.REG_AUTH);
    sendData.append('identifier', identifier);
    sendData.append('selectedIds', JSON.stringify(selectedIds)); 
    
    this.http.post<any>('APIENDPOINT', sendData).subscribe(data => {
      console.log(data);
    }, error => {  
      console.log(error);
    });
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 2018-10-05
      • 1970-01-01
      • 2015-09-15
      • 2019-05-13
      • 1970-01-01
      相关资源
      最近更新 更多