die axios POST
-Anforderung trifft die URL auf dem Controller, setzt jedoch Nullwerte für meine POJO-Klasse. Wenn ich Entwickler-Tools in Chrome durcharbeite, enthält die Nutzlast Daten. Was mache ich falsch?
Axios POST Request:
var body = {
userName: 'Fred',
userEmail: '[email protected]'
}
axios({
method: 'post',
url: '/addUser',
data: body
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Browser-Antwort:
Wenn ich Überschriften setze als:
headers:{
Content-Type:'multipart/form-data'
}
Die Anfrage löst den Fehler aus
Fehler beim Posten von mehrteiligen/Formulardaten. In der Kopfzeile des Inhaltstyps fehlt eine Begrenzung
Wenn ich die gleiche Anfrage im Postboten mache, funktioniert es gut und setzt Werte auf meine POJO-Klasse.
Kann mir jemand erklären, wie man Grenzen setzt oder wie ich Formulardaten mit Axios senden kann.
Sie können Axios-Daten mit FormData () wie folgt posten:
var bodyFormData = new FormData();
Fügen Sie dann die Felder zu dem Formular hinzu, das Sie senden möchten:
bodyFormData.set('userName', 'Fred');
Wenn Sie Bilder hochladen, können Sie .append
verwenden.
bodyFormData.append('image', imageFile);
Und dann können Sie Axios Post-Methode verwenden (Sie können es entsprechend ändern)
axios({
method: 'post',
url: 'myurl',
data: bodyFormData,
config: { headers: {'Content-Type': 'multipart/form-data' }}
})
.then(function (response) {
//handle success
console.log(response);
})
.catch(function (response) {
//handle error
console.log(response);
});
Sie können mehr lesen hier
Check out querystring .
Sie können es wie folgt verwenden:
var querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));
In meinem Fall musste ich dem Header das Boundary wie folgt hinzufügen:
const form = new FormData();
formData.append(item.name, fs.createReadStream(pathToFile));
const response = await axios({
method: 'post',
url: 'http://www.yourserver.com/upload',
data: form,
headers: {
'content-type': `multipart/form-data; boundary=${form._boundary}`,
},
});
Diese Lösung ist auch nützlich, wenn Sie mit React Native arbeiten.
Kompliziert wird es, wenn Sie Dateien über multipart/form-data
veröffentlichen möchten, insbesondere mehrere Binärdateien. Unten ist ein Arbeitsbeispiel:
const FormData = require('form-data')
const fs = require('fs')
const path = require('path')
const concat = require('concat-stream')
const formData = new FormData()
formData.append('json', JSON.stringify({ to: [{ phoneNumber: process.env.RINGCENTRAL_RECEIVER }] }), 'test.json')
formData.append('attachment', fs.createReadStream(path.join(__dirname, 'test.png')), 'test.png')
formData.pipe(concat({ encoding: 'buffer' }, async data => {
const r = await rc.post('/restapi/v1.0/account/~/extension/~/fax', data, {
headers: formData.getHeaders()
})
console.log(r.data)
}))
headers: {'Content-Type': 'multipart/form-data' }
bevorzuge ich headers: formData.getHeaders()
concat-stream
verwenden, um mehrere Dateistreams zusammenzufassenasync
und await
oben, Sie können sie in einfache Versprechen-Aussagen ändern, wenn Sie sie nicht mögenNoch einfacher:
axios.post('/addUser',{
userName: 'Fred',
userEmail: '[email protected]'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Die obige Methode funktionierte für mich, aber da es etwas war, das ich oft brauchte, verwendete ich eine grundlegende Methode für flache Objekte. Beachten Sie, ich habe auch Vue und nicht REACT verwendet
packageData: (data) => {
const form = new FormData()
for ( const key in data ) {
form.append(key, data[key]);
}
return form
}
Das hat bei mir funktioniert, bis ich auf komplexere Datenstrukturen mit verschachtelten Objekten und Dateien gestoßen bin, die dann folgendes zuließen
packageData: (obj, form, namespace) => {
for(const property in obj) {
// if form is passed in through recursion assign otherwise create new
const formData = form || new FormData()
let formKey
if(obj.hasOwnProperty(property)) {
if(namespace) {
formKey = namespace + '[' + property + ']';
} else {
formKey = property;
}
// if the property is an object, but not a File, use recursion.
if(typeof obj[property] === 'object' && !(obj[property] instanceof File)) {
objectToFormData(obj[property], formData, property);
} else {
// if it's a string or a File
formData.append(formKey, obj[property]);
}
}
}
return formData;
}