Angular 10 | Publicación http | Array de cadenas anexar FormData

Sep 15 2020

Tengo que realizar una solicitud de publicación en un punto final de la API, pero obtengo un estado de error 500.

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

Este es mi codigo:

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

El problema está en esta línea: sendData.append('selected[]', selectedIds);no tengo ni idea de cómo pasar una matriz a FormData.

Este es un ejemplo práctico de nuestra aplicación para Android. Necesito convertir esta solicitud en sintaxis angular / mecanografiada:

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

Lo que sé hasta ahora:

Parece que angular no serializa los datos, así que probé algunas correcciones codificadas, pero ninguna de ellas funcionó:

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

Si utilizo en selectedlugar de selected[], no obtengo ningún error, pero obviamente no se actualizan los datos, por lo que estoy bastante seguro de que es un problema de serialización / análisis.

Respuestas

2 ForestG Sep 15 2020 at 12:46

De esta respuesta :

El método append () de FormData solo puede aceptar objetos de tipo cadena o blob. Si necesita agregar la matriz, use el método JSON.stringify () para convertir su matriz en una cadena JSON válida.

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

El statusCode 500es el error interno del servidor, y es el problema del lado del servidor. Por lo tanto, es mejor verificar APIsi puede recibir su solicitud o no.

El append()método de FormData acepta stringo blobescribe Para que puedas usar el JSON.stringify()método ( formData.append('selectedIds', JSON.stringify(selectedIds));). Así que prueba esto:

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