Pobieram adres URL taki jak ten:
fetch(url, {
mode: 'no-cors',
method: method || null,
headers: {
'Accept': 'application/json, application/xml, text/plain, text/html, *.*',
'Content-Type': 'multipart/form-data'
},
body: JSON.stringify(data) || null,
}).then(function(response) {
console.log(response.status)
console.log("response");
console.log(response)
})
Moje API oczekuje, że dane będą multipart/form-data
takie, więc używam content-type
tego typu ... Ale daje mi odpowiedź z kodem statusu 400.
Co jest nie tak z moim kodem?
źródło
Niedawno pracowałem z IPFS i udało mi się to. Przykład curl dla IPFS do przesłania pliku wygląda następująco:
curl -i -H "Content-Type: multipart/form-data; boundary=CUSTOM" -d $'--CUSTOM\r\nContent-Type: multipart/octet-stream\r\nContent-Disposition: file; filename="test"\r\n\r\nHello World!\n--CUSTOM--' "http://localhost:5001/api/v0/add"
Podstawowym założeniem jest to, że każda część (rozszczepiony przez smyczkowy
boundary
z--
) ma własne nagłówki (Content-Type
w drugiej części, na przykład.) DoFormData
obiektu zarządza to wszystko dla Ciebie, więc jest to lepszy sposób, aby osiągnąć nasze cele.Przekłada się to na pobieranie API w następujący sposób:
const formData = new FormData() formData.append('blob', new Blob(['Hello World!\n']), 'test') fetch('http://localhost:5001/api/v0/add', { method: 'POST', body: formData }) .then(r => r.json()) .then(data => { console.log(data) })
źródło
FormData
przykładzie nie jest to potrzebne, ponieważ przeglądarka wysyła ten nagłówek za Ciebie, a także zarządza wszystkimi granicami mime, co jest celem tego rozwiązania.