Angulaire 10 | Message http | Tableau de chaînes ajouter FormData

Sep 15 2020

Je dois faire une demande de publication à un point de terminaison d'API, mais j'obtiens un statut d'erreur 500.

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

Voici mon code:

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

Le problème est dans cette ligne: sendData.append('selected[]', selectedIds);je n'ai aucune idée de comment passer un tableau à FormData.

Ceci est un exemple fonctionnel de notre application Android. J'ai besoin de convertir cette demande en syntaxe angulaire / dactylographiée:

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

Ce que je sais jusqu'à présent:

Il semble que angulaire ne sérialise pas les données, j'ai donc essayé des correctifs codés en dur, mais aucun de ceux-ci n'a fonctionné:

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 j'utilise à la selectedplace de selected[], alors je n'obtiens aucune erreur, mais évidemment aucune donnée n'est mise à jour, donc je suis presque sûr que c'est un problème de sérialisation / analyse.

Réponses

2 ForestG Sep 15 2020 at 12:46

De cette réponse :

La méthode append () de FormData ne peut accepter que des objets de type chaîne ou blob. Si vous devez ajouter le tableau, utilisez la méthode JSON.stringify () pour convertir votre tableau en une chaîne JSON valide.

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

C'est statusCode 500l'erreur de serveur interne, et c'est le problème côté serveur. Il est donc préférable de vérifier APIs'il peut recevoir votre demande ou non.

append()Accepter stringou blobtaper la méthode de FormData Vous pouvez donc utiliser JSON.stringify()method ( formData.append('selectedIds', JSON.stringify(selectedIds));). Alors essayez ceci:

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