0

Dies ist ein ROTATION Beispiel, das funktioniert gut:Wie mit mehrteiliger POST/form-data-Header und Formdata holen mit

curl -X POST \ 
    <url> \ 
    -H 'authorization: Bearer <token>' \ 
    -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ 
    -F [email protected] \ 
    -F userId=<userId> 

Ich versuche, diese Anforderung isomorphic-fetch mit zu reproduzieren.

Ich habe den folgenden Code versucht:

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

Ich benutze fs.readFileSync um die file-FormData weitergegeben zu erzeugen.

Das obige Beispiel gibt einen 401 HTTP-Statuscode (unberechtigten) mit einer Meldung Fehlermeldung, dass die userId in dem Token eingebettet (via Header gesendet) nicht die userId von formData geben lassen.

Also mein Verdacht ist, dass die FormData, die in der REST-API ankommt, nicht ausreichend gebildet wird.

Das Problem kann mit dem Content-Length Header in Beziehung gesetzt werden, aber ich finde es nicht einen besseren Weg zu berechnen (wenn ich das ich einen 411 fehlenden Statuscode Content-Length Header HTTP erhalten Content-Length Header nicht verwenden).

Könnte der Fall sein, dass dies aufgrund eines falschen Werts im Header Content-Length fehlschlägt?

Haben Sie noch weitere Vorschläge, warum dies fehlschlägt oder wie Sie es besser debuggen können?

Wenn weitere Informationen benötigt werden, um dieses Problem zu klären, fragen Sie einfach nach.

UPDATE

ich das form-data Modul, um versucht haben, den richtigen Content-Length Wert mit der Methode formData.getLengthSync()

aber das Problem bleibt das gleiche (401 Fehler HTTP-Statuscode-Antwort) zu erhalten.

+0

Drop the "Content-Type" -Anforderungsheader, der vom Browser automatisch generiert werden muss, um die Multipart-Grenze einzubeziehen. Ich denke, wenn Sie das und die 'Content-Length'-Header fallen lassen, sollten Sie in Ordnung sein. – idbehold

+0

Ich habe das schon ohne Erfolg versucht, wenn ich den 'Content-Length' Header nicht sende, gibt' API' einen '411' Fehler HTTP Status Code zurück:' Der Server verweigert die Anfrage ohne einen definierten Inhalt- Length ' – rfc1484

+0

Versuchen Sie, die Inhaltslänge auf 12345 einzustellen. Welcher Server Sie hochladen, wurde nicht sehr gut gestaltet. – idbehold

Antwort

2

Wenn Sie Ihr Netzwerk Inspektor öffnen, führen Sie diesen Code-Schnipsel, und senden Sie das Formular sollten Sie sehen, dass die Content-Length richtig eingestellt ist:

const foo = document.getElementById('foo') 
 
foo.addEventListener('submit', (e) => { 
 
    e.preventDefault() 
 
    const formData = new FormData(foo) 
 
    formData.append('userId', 123) 
 
    fetch('//example.com', { 
 
    method: 'POST', 
 
    body: formData 
 
    }) 
 
})
<form id="foo"> 
 
    <input id="file" type="file" name="file"/><br><br> 
 
    <button type="submit">Submit</button> 
 
</form>

+0

Also, wenn ich richtig verstehe, ist das Problem nicht mit der Client-Implementierung, sondern mit der REST-API-Implementierung (was bedeutet, dass es keinen '411' Fehler-HTTP-Statuscode zurückgibt, wenn der' Content-Length'-Header nicht übergeben wird) – rfc1484

+0

@ rfc1484 Ich sage, dass der einzige Header, den Sie in Ihrer 'fetch()' Konfiguration angeben sollten, der Header 'Authorization' ist, da sowohl die' Content-Length'- als auch, Content-Type'-Header automatisch vom Browser gesetzt werden. Versuchen Sie also, diese beiden Zeilen aus Ihrem Code zu entfernen. – idbehold

+0

Ich verstehe, aber ich habe bereits versucht, diese Lösung und es hat nicht funktioniert (es gab den '411' Fehler zuvor erwähnt). Da ich dies mit einem Komponententest teste, denke ich, das Problem ist, dass die Anfrage serverseitig durchgeführt wird, so dass in diesem Fall die Header nicht automatisch vom Browser gesetzt werden, da dieser nicht durchläuft Browser und verwendet direkt die 'node-fetch'-Bibliothek (die zugrunde liegende Bibliothek, die von' isomorphic-fetch' verwendet wird, wenn serverseitige Anfragen ausgeführt werden). Es kann also sein, dass dies clientseitig funktioniert, obwohl der Komponententest gerade fehlschlägt. – rfc1484