Angular 10 | Postagem Http | Matriz de string anexa FormData

Sep 15 2020

Tenho que fazer uma solicitação de postagem para um endpoint de api, mas recebo um status de erro 500.

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

Este é o meu código:

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);
});

A questão é esta linha: sendData.append('selected[]', selectedIds);não tenho ideia de como passar um array para FormData.

Este é um exemplo prático de nosso aplicativo Android. Preciso converter esta solicitação na sintaxe angular / de texto de tipo:

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

O que eu sei até agora:

Parece que o angular não serializa os dados, então tentei algumas correções codificadas, mas nenhuma delas funcionou:

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));

Se eu usar em selectedvez de selected[], não recebo nenhum erro, mas obviamente nenhum dado é atualizado, então tenho certeza de que é um problema de serialização / análise.

Respostas

2 ForestG Sep 15 2020 at 12:46

Desde esta resposta :

O método append () de FormData só pode aceitar objetos do tipo string ou blob. Se você precisar anexar a matriz, use o método JSON.stringify () para converter sua matriz em uma string JSON válida.

formData.append('selected[]', JSON.stringify(selectedIds));
1 ng-hobby Sep 15 2020 at 12:53

Este statusCode 500é o erro interno do servidor e é o problema do lado do servidor. Portanto, é melhor verificar APIse ele pode receber sua solicitação ou não.

O append()método de FormData aceita stringou blobdigite Portanto, você pode usar o JSON.stringify()método ( formData.append('selectedIds', JSON.stringify(selectedIds));). Então tente isso:

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);
});