Ceci est un exemple CURL qui fonctionne très bien:Comment POST avec en-tête multipart/form-data et FormData en utilisant fetch
curl -X POST \
<url> \
-H 'authorization: Bearer <token>' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F [email protected] \
-F userId=<userId>
Je suis en train de reproduire cette demande à l'aide isomorphic-fetch.
J'ai essayé le code suivant:
const formData = new FormData();
formData.append('file', file);
formData.append('userId', userId);
return fetch(`<url>`, {
method: 'POST',
headers: {
'Content-Length': file.length
'Authorization: Bearer <authorization token>',
'Content-Type': 'multipart/form-data'
},
body: formData
})`
J'utilise fs.readFileSync
pour générer le file
passé à FormData
.
L'exemple précédent renvoie un code d'état 401
HTTP (non autorisé) avec un message d'erreur indiquant que le userId
embarqué dans le jeton (envoyé par la tête) ne correspond pas au userId
passé de formData
.
Donc, ma suspicion est que le FormData
qui arrive à l'API REST n'est pas formé de manière adéquate.
Le problème peut être lié avec l'en-tête Content-Length
, mais je ne trouve pas une meilleure façon de le calculer (si je ne me l'en-tête Content-Length
je reçois un en-tête de code d'état HTTP 411
Content-Length
manquant).
Le cas échéant, cela est dû à une valeur incorrecte dans l'en-tête Content-Length
? Toutes les autres suggestions pour expliquer pourquoi cela échoue ou comment mieux le déboguer?
Si d'autres informations sont nécessaires pour clarifier ce problème, veuillez le demander.
MISE À JOUR
J'ai essayé le module form-data afin d'obtenir la bonne valeur Content-Length
en utilisant la méthode formData.getLengthSync()
Cependant, le problème reste le même (401
erreur réponse de code d'état HTTP).
Drop the L'en-tête de demande Content-Type doit être généré automatiquement par le navigateur pour inclure la limite multi-parties. Je pense que si vous laissez tomber cela et les en-têtes 'Content-Length' vous devriez être d'accord. – idbehold
Je l'ai déjà essayé sans succès, quand je n'envoie pas l'en-tête 'Content-Length',' API' renvoie une erreur '411': code d'état HTTP:' Le serveur refuse d'accepter la requête sans contenu défini. Length' – rfc1484
Essayez de définir la longueur du contenu à 12345. Le serveur sur lequel vous téléchargez n'est pas très bien conçu. – idbehold