ïŒ318ãšåæ§ã«ãããŒãã§axiosã䜿çšããŠPOSTãªã¯ãšã¹ããè¡ãããšãã§ããŸããã ãããããã©ãŠã¶ã§ã¯ãåãã³ãŒããæ£åžžã«æ©èœããŠããããã§ãã
const fdata = new FormData();
fdata.append('user', u);
fdata.append('hostnames', n.join(' '));
const host = localStorage.getItem('host');
const port = localStorage.getItem('port');
axios({
url: `http://${host}:${port}/hosts/remove`,
method: 'post',
data: fdata
}).then(response => {
if (response.status === 200) {
console.log(response.data);
console.log('Removed host successfully');
}
return null;
}).catch(er => console.log(er));
ãŠãã¬ã¹ãã䜿çšãããšãæ©èœããŸãã
unirest.post(`http://${host}:${port}/hosts/remove`)
.headers({ 'Content-Type': 'multipart/form-data' })
.field('user', u)
.field('hostnames', h.join(' '))
.end(response => {
console.log(response.body);
});
ããã¯ïŒ789ã®è€è£œãšèŠãªãããå¯èœæ§ããããŸãã
nodejsã®Axiosã§form-data
ããã±ãŒãžã䜿çšããããšãã§ããŸããã åºæ¬çã«FormData
ãããªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã ãã ããçæãããããããŒãæåã§Axiosã«æž¡ãããã«æ³šæããå¿
èŠããããŸãã äŸãã°ïŒ
const axios = require('axios');
const FormData = require('form-data');
const form = new FormData();
// Second argument can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
headers: form.getHeaders(),
}).then(result => {
// Handle resultâŠ
console.log(result.data);
});
ãããç§ã¯ãã®form-data
ããã±ãŒãžã§è©ŠããŸããã ããŠãä»ã¯å€§äžå€«ã§ãã代ããã«JSONã解æããããã«ãµãŒããŒåŽAPIãå€æŽããŸããã
誰ããnodejsã¢ããªã§äœããã¹ãããæããŠããããŸããïŒ
@ ar412 https://github.com/mzabriskie/axios/issues/1006#issuecomment -320165427ã§äŸãæããããšããŸããããäœãæ±ããŠããã®ãæ確ã«ã§ããŸããïŒ
@binki axiosã䜿çšããŠrestapiã§ããã€ãã®ããŒã¿ãå«ãPOSTãªã¯ãšã¹ããéä¿¡ããŠããå Žåãæ®ãã®apiïŒãšã¯ã¹ãã¬ã¹ã¢ããªã±ãŒã·ã§ã³å ã«ããïŒã§ãã®ããŒã¿ãååŸããæ¹æ³ã
ãããè©Šãããšãã§ããŸãhttps://expressjs.com/en/4x/api.html#req@ ar412
@ ar412 Expressã§ãã«ãããŒãããŒã¿ãåä¿¡ããã«ã¯ã body-parser
ã®ããã¥ã¡ã³ãã§æšå¥šãããŠããããã«ã busboy
ãããªãã®ã䜿çšã§ããŸãã åºæ¬çã«ãExpressã§ã¢ããããŒãããããã¡ã€ã«ãåŠçããæ¹æ³ãåŠã¶ããã«ãããã¯Axiosãšã¯ãŸã£ããé¢ä¿ããªãã®ã§ããã®ã¹ã¬ãããä¹ã£åã£ãã®ã§ä»ã®å Žæã«å°ããã»ããããã§ã;-)ã ããšãã°ã SOã§ãã®åçãåç
§ããŠãã ããã
ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸããïŒform.getHeadersïŒïŒã¯é¢æ°ã§ã¯ãããŸãã
@binki
ããïŒ fs.readFileïŒpathïŒã䜿çšããŠå€æ°ã«ä¿åãããç»åãã¡ã€ã«ãPOSTãããhapi.jsãµãŒããŒããããŸãã
ãããFormDataïŒïŒãšããŠéä¿¡ããŠåäœãããããšãã§ããŸãã
ããã¯ç§ã®ã³ãŒãã§ãïŒ
fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
var form = new FormData()
form.append('file', imageData, {
filename: 'unicycle.jpg', // ... or:
filepath: '/../static/lisa_server.jpg',
contentType: 'image/jpg',
knownLength: 19806
})
次ã«ããªã¯ãšã¹ãã®æ¬æãšããŠãã©ãŒã ãéä¿¡ããoptions ['Content-Type'] = 'multipart / form-data'ãèšå®ããŸãã
æäŒã£ãŠããããŸããïŒ
ãšãŠãæé£ãïŒ
@bstolarzå®è¡ããŠããBuffer
ãæž¡ãå Žåã knownLength
ãæž¡ãå¿
èŠã¯ãããŸããã ãŸããèªåãæžãããã®ïŒ form-data
ã®READMEã®äŸãããšã©ãŒãã³ããŒã貌ãä»ãïŒãèªãã å Žåã¯ã filename
ãŸãã¯filepath
ã©ã¡ããäžæ¹ã®ã¿ãæå®ããå¿
èŠããããŸããäž¡æ¹ã¯æå®ããªãã§ãã ããã ããªããèšå®ããããšãçã«ããªã£ãŠãããããããªãå¯äžã®ãã®ã¯æ¬¡ã®ãšããã§ãïŒ
filename
ãŸãã¯filepath
contentType
ïŒãµãŒããŒãç¹å®ã®Content-Typeå€ãå¿
èŠãšããå Žåããã以å€ã®å Žåã¯ããããçç¥ã§ããŸãïŒãç§ã¯è³ãèµ·ãã£ãŠããããšã¯ãããªããéä¿¡ããŠããç»åã®ãµã€ãºããªã倧ãããæããŠããããšã§ãã19806
ãã®ããã 19806
å€ãäœãã§ããããªããã®äŸããã³ããŒform-data
ç¬èªã®ããŒã¿çšã«èšç®ãããã®ã§ã¯ãªããform-data
èªäœããšã©ãŒãã¹ããŒããããHTTPãªã¯ãšã¹ãã«ç¡å¹ãªããŒã¿ãæžã蟌ãã ãããå¯èœæ§ããããŸãã è¿ãããaxios.post()
ãPromise
ãæåŠããŠãããã©ããããŸãã¯äŸå€ãã¹ããŒãããŠãããã©ããã確èªããŸãããïŒ axiosèŠæ±ãæåŠãããå Žåã¯ããšã©ãŒãªããžã§ã¯ãã«result
ããŒããããã©ããã確èªããããå Žåã¯ã err.result.status
å€ãäœã§ãããã確èªããŸãã 404ãŸãã¯403以å€ã®4xxå€ã®å Žåã¯ããµãŒããŒãäžæ£ãªåœ¢åŒã®ãªã¯ãšã¹ããæåŠããŠããããšãæå³ããŸããããã¯ãæ¢ç¥ã®ãµã€ãºãæ£ãããªãããšãåå ã§ããå¯èœæ§ããããŸãã
@binki
ãããããªãã®å¿çã«æè¬ããŸãã ç§ã¯ããªããèšã£ãããšãä¿®æ£ããã®ã§ãä»ç§ã®ã³ãŒãã¯
fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
var form = new FormData()
form.append('file', imageData, {
filepath: __dirname+'/../static/lisa_server.jpg',
contentType: 'image/jpg'
})
ãããããµãŒããŒã¯411ãé·ããå¿ èŠã§ãããã¹ããŒããŸãïŒFormDataã§å®å šã«ãµããŒããããŠããããã«èŠããfs.createReadStreamãè©ŠããŸããããåãé·ãã®ãšã©ãŒãçºçããŸãïŒã
@binki
ããããŒã®content-lengthãæäžå±€ã«èšå®ã§ããŸãããããã®ãšã©ãŒã¯çºçããªããªããŸããã
ãµãŒããŒãã411ãååŸããªãã£ãã®ã§ããã€ãŠ400ããã¡ã€ã«ãæäŸãããŠããŸããããšãããšã©ãŒã«æ»ããŸããã
ããã¯ãªã¯ãšã¹ããã©ã®ããã«èŠãããã§ã
éå§ãªã¯ãšã¹ã
{ adapter: [Function: httpAdapter],
transformRequest: { '0': [Function: transformRequest] },
transformResponse: { '0': [Function: transformResponse] },
timeout: 5000,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
headers:
{ common: { Accept: 'application/json, text/plain, */*' },
delete: {},
get: {},
head: {},
post: { 'Content-Type': 'application/json' },
put: { 'Content-Type': 'application/json' },
patch: { 'Content-Type': 'application/json' },
'User-Agent': 'trojan server 1.0',
'X-Origin-Panamera': 'Staging',
'Content-Length': 25247 },
baseURL: 'https://letgoar-a.akamaihd.net/api/v1',
method: 'post',
url: 'https://<baseDomain>/api/v1/images',
data:
FormData {
_overheadLength: 218,
_valueLength: 25247,
_valuesToMeasure: [],
writable: false,
readable: true,
dataSize: 0,
maxDataSize: 2097152,
pauseStreams: true,
_released: false,
_streams:
[ '----------------------------677738213014296377492349\r\nContent-Disposition: form-data; name="file"; filename="/Users/brenda/repos/qreator2/qreator/trojan-server/src/static/lisa_server.jpg"\r\nContent-Type: image/jpg\r\n\r\n',
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e2 11 2c 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 11 1c 61 70 70 6c 02 00 00 00 ... >,
[Function: bound ] ],
_currentStream: null,
_boundary: '--------------------------677738213014296377492349' },
'Content-Type': 'multipart/form-data' }
ããããã§ãã¯ããŠãã ããã ããªãã«ãšã£ãŠãããã¯åççãªèŠæ±ã®ããã«èŠããŸããïŒ
åãã£ãŠæè¬ããŸã
@bstolarzç§ã¯ããªãã®åé¡ãåçŸããããã«æåãå°œãããŸããã ããããç§ã¯ã§ããŸããã ç§ã¯ããªããããŠããããšãæš¡å£ããããšè©Šã¿ãããã«ãã®ã³ãŒããæžããŸããã ãã ããæåã§Content-Length
èšå®ããããšã¯æå³çã«çç¥ããŸããã Content-Length
èšå®ããŠãããšããäºå®ã¯ãåé¡ã«é¢é£ããŠããå¯èœæ§ããããšç¢ºä¿¡ããŠããŸãã form-data
ã«èšç®ãä»»ããŠã¿ãŠãã ããããã®ããã form.getHeaders()
åŒã³åºãå¿
èŠããããŸãã
ãã®è²Œãä»ããåç
§ããŠãã ããïŒ https ïŒ axios.post()
ãŸãã¯axios()
ãåŒã³åºãæ¹æ³ãå€æŽããããšãã§ããããã¯ããªãã®ããã«æ©èœããŸããïŒ
ããã§ãåé¡ã解決ããªãå Žåã¯ãã³ãŒããç¬èªã®ã¹ã¯ãªããã«ç§»åããŠãããã§åçŸããŠã¿ãŠãã ããã åé¡ã®è§£æ±ºã«åœ¹ç«ã€å ŽåããããŸãã ããªãã¯ãŸã ãžã®åŒã³åºããå«ããŠãã ããããã¹ããã«ã³ãŒããç«ã¡åŸçããŠããå Žåã¯axios()
ãŸãã¯axios.post()
èŠæšãªã©ãããç§ãã§ãããªãã°ãããã§ããããªã³ã¯ããç§ã¯ããã«ãªããŸãã
ããã§ããŸã£ããæ©èœããŸãã...
@rodrigogsãã«ããå¿ èŠãªå Žåã¯ããã詳现ã«ããå¿ èŠããããŸã;-)ã
ç§ã¯Axiosã«é¢ãããã®æçãªèª¿æ»ã«åŸããæçµçãªè§£æ±ºçã¯ç§ã®ããã«æ©èœããŸãïŒãªã³ã¯ïŒ
ããããã®ã³ããŒ/貌ãä»ãã§ãïŒ
import fs from 'fs';
import FormData from 'form-data';
import axios from 'axios';
let data = fs.createReadStream(__dirname + '/test.jpg');
let form = new FormData();
form.append('type','image');
form.append('media',data,'test.jpg');
function getHeaders(form) {
return Promise((resolve, reject) => {
form.getLength((err, length) => {
if(err) { reject(err); }
let headers = Object.assign({'Content-Length': length}, form.getHeaders());
resolve(headers);
});
});
}
getHeaders(form)
.then((headers) => {
return axios.post(url, form, {headers:headers})
})
.then((response)=>{
console.log(response.data)
})
.catch(e=>{console.log(e)})
@westofpluto ãç§ãåããšã©ãŒãçºçããŸãã @binki ãäœãèãã¯ãããŸããïŒ
ãšã©ãŒ
form.getHeadersã¯é¢æ°ã§ã¯ãããŸãã
@smplyjrã³ã³ããã¹ããå¢ãããŠã form
ãååŸããæ¹æ³ãæããŠãã ããã ã³ãŒãããªããã°ãç§ãã¡ã¯ããªããäœãããŠããã®ããæããããããªããå©ãããããããšã¯ã§ããŸããã
nodejsãŠãŒã¶ãŒã®å Žåã次ã®ããã«ã¯ãšãªæåålibã䜿çšããŠè§£æ±ºããŸãã
const querystring = require('querystring')
axios
.post(URL, querystring.stringify(data))
.then((response) => ...)
.catch((error) => ...)
@heldridaãè¿°ã¹ãããã«ã https ïŒ form-data
ããã±ãŒãžã«ã¯ãããã§ããããçš®é¡ã®åé¡ãããããããæ©èœãããããã«é«ªãåŒã£åŒµã£ãŠããŸãã ãã§ãã
@heldrida @ ashok-sc axiosã§ãã¡ã€ã«ãã¢ããããŒãããã«ã¯ã querystring
ãŸãã¯qs
ã䜿çšããå¿
èŠããããŸããïŒ AWS Lambdaãããã¡ã€ã«ãã¢ããããŒãããããã«axiosã䜿çšããŠããŸãããããããFileãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããªãããšã¯æããã§ãã
@bstolarzç§ã¯ããªãã®åé¡ãåçŸããããã«æåãå°œãããŸããã ããããç§ã¯ã§ããŸããã ç§ã¯ããªããããŠããããšãæš¡å£ããããšè©Šã¿ãããã«ãã®ã³ãŒããæžããŸããã ãã ããæåã§
Content-Length
èšå®ããããšã¯æå³çã«çç¥ããŸãããContent-Length
èšå®ããŠãããšããäºå®ã¯ãåé¡ã«é¢é£ããŠããå¯èœæ§ããããšç¢ºä¿¡ããŠããŸããform-data
ã«èšç®ãä»»ããŠã¿ãŠãã ããããã®ãããform.getHeaders()
åŒã³åºãå¿ èŠããããŸãããã®è²Œãä»ããåç §ããŠãã ããïŒ https ïŒ
axios.post()
ãŸãã¯axios()
ãåŒã³åºãæ¹æ³ãå€æŽããããšãã§ããããã¯ããªãã®ããã«æ©èœããŸããïŒããã§ãåé¡ã解決ããªãå Žåã¯ãã³ãŒããç¬èªã®ã¹ã¯ãªããã«ç§»åããŠãããã§åçŸããŠã¿ãŠãã ããã åé¡ã®è§£æ±ºã«åœ¹ç«ã€å ŽåããããŸãã ããªãã¯ãŸã ãžã®åŒã³åºããå«ããŠãã ããããã¹ããã«ã³ãŒããç«ã¡åŸçããŠããå Žåã¯
axios()
ãŸãã¯axios.post()
èŠæšãªã©ãããç§ãã§ãããªãã°ãããã§ããããªã³ã¯ããç§ã¯ããã«ãªããŸãã
ããããšãã Content-Lengthãè¿œå ãããšãåé¡ã解決ããFormDataã§axiosããã¯ãšã³ã2ããã¯ãšã³ãåŒã³åºãã䜿çšã§ããããã«ãªããŸããã
const options = {
method: 'POST',
url: myUrl,
data: justJsonBody,
transformRequest: [function (data, headers) {
const formData = convertToFormData(data); // returrns ForrmData from form-data
headers['Content-Type'] = formData.getHeaders()['content-type'];
headers['Content-Length'] = formData._overheadLength;
return formData;
}]
};
ããã¯ïŒ789ã®è€è£œãšèŠãªãããå¯èœæ§ããããŸãã
nodejsã®Axiosã§
form-data
ããã±ãŒãžã䜿çšããããšãã§ããŸããã åºæ¬çã«FormData
ãããªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã ãã ããçæãããããããŒãæåã§Axiosã«æž¡ãããã«æ³šæããå¿ èŠããããŸãã äŸãã°ïŒconst axios = require('axios'); const FormData = require('form-data'); const form = new FormData(); // Second argument can take Buffer or Stream (lazily read during the request) too. // Third argument is filename if you want to simulate a file upload. Otherwise omit. form.append('field', 'a,b,c', 'blah.csv'); axios.post('http://example.org/endpoint', form, { headers: form.getHeaders(), }).then(result => { // Handle result⊠console.log(result.data); });
ããã§å¥ã®æ¹æ³ã ãã®ããã«ããŠããããã·ãšãŒãžã§ã³ããããã³ãã®ä»ã®æ§æã«è¿œå ã§ããŸãã
const axios = require('axios');
const FormData = require('form-data');
const ProxyAgent = require('proxy-agent');
const form = new FormData();
// Second argument can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios({
method: 'POST',
url: 'http://example.org/endpoint',
data: form,
agent: new ProxyAgent("https://username:[email protected]:8080"),
headers: bodyFormData.getHeaders()
}).then(result => {
// Handle resultâŠ
console.log(result.data);
});
ããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãã
// ES6
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';
FormData.prototype.getHeadersWithContentLength = function getHeadersWithContentLength() {
return new Promise((resolve, reject) => {
this.getLength((err, length) =>
err ? reject(err) : resolve({ ...this.getHeaders(), 'Content-Length': length })
)
})
}
const payload = new FormData();
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, { file }) => {
if (err) return;
payload.append("file", fs.createReadStream(file.path), {
filename: file.name,
contentType: file.type
});
payload.getHeadersWithContentLength().then(headers => {
api
.post(endpoint, payload, { headers })
.then(({ data }) => data)
.then(data => res.json({ data }));
});
});
ãã®æçš¿ã®ãã¹ãŠã®è²¢ç®è
ã«æè¬ããŸãã Axiosã䜿çšããŠform-data
ãã©ãŒã ãAmazonãã±ããã«æçš¿ããããã¯ãšã³ãã«POSTããéã«åé¡ãçºçããåŸããœãªã¥ãŒã·ã§ã³ã¯æåã§content-length
èšå®ããããšã«ãªããŸãã...ã
ç§ã®ã³ãŒããåé¡ãæ±ããŠããä»ã®äººã«ãšã£ãŠã¯ããããæ©èœãããã®ã«åé¡ããã次ã®è¡ãå©ããããšãã§ãããããããŸãã:)
const axios = require('axios');
const FormData = require('form-data');
// Where buffer is a file
formData.append('file', buffer);
// Added a promise version like seen in earlier comments to get this
const contentLength = await formData.getLength();
await axios(`<ENDPOINT>`, {
method: 'POST',
baseURL: <BASE_URL>,
params: {
fileName: '<FILE_NAME>.png'
},
headers: {
authorization: `Bearer <TOKEN>`,
...formData.getHeaders(),
'content-length': contentLength
},
data: formData
});
Axiosã䜿çšããŠ
form-data
ãã©ãŒã ãAmazonãã±ããã«æçš¿ããããã¯ãšã³ãã«POSTããéã«åé¡ãçºçããåŸããœãªã¥ãŒã·ã§ã³ã¯æåã§content-length
èšå®ããããšã«ãªããŸãã...ã
ã¯ãã ç§ãšç§ã®ååããããŒã¿ãéä¿¡ãããŠããªãããšãããã¯ãšã³ãã«POSTããããšãããšãã«æ°æéãè²»ãããŸãããããªã¯ãšã¹ãã远跡ããŠã³ã³ãã³ãã確èªã§ãããããããŒã¿ãéä¿¡ãããŠããªãããšã¯æããã§ããã åé¡ã¯ãcontent-lengthããããŒãæ¬ èœããŠããããšã§ããã
泚æãšããŠãFormDataã«ãããã¡ãè¿œå ããå Žåã¯ã formData.getLengthSync()
ãåŒã³åºããŠãåé¡ãããŸããããã¹ããªãŒã ãåŠçããå Žåã¯ãæåã«fs.statSync(filePath).size
ãã¡ã€ã«ãçµ±èšããå¿
èŠããããŸãããŸãã¯ãå¥ã®æ¹æ³ã§ãã«ãµã€ãºãååŸããŸãïŒã¢ããã¹ããªãŒã ã®content-lengthããããŒãªã©ïŒãããšãã°ãã¹ããªãŒã ããªã¯ãšã¹ãããœã±ãããªã©ããã®ãã®ã§ããå Žåãªã©ã§ãã 代ããã«ã¹ããªãŒã ããã£ã¹ã¯ããã®ãã®ã§ããå Žåã fs.statSync(filePath).size
ã¯ãµã€ãºããã€ãåäœã§æäŸãããããFormDataã«è¿œå ãããšãã«knownLengthã§è¿œå ã§ããŸãã
formData.append("file", fs.createReadStream(filePath), { filename: 'whatever.pdf', knownLength: fs.statSync(filePath).size });
ãã¡ããããã¹ãŠã®Syncã¡ãœãããasyncã¡ãœãããšawaitããŒã¯ãŒãã«åãæ¿ããããšãã§ããŸãã
// Added a promise version like seen in earlier comments to get this const contentLength = formData.getLength();
formDataã®åã«await
ãå¿ãããšæããŸã...
æãåèã«ãªãã³ã¡ã³ã
ããã¯ïŒ789ã®è€è£œãšèŠãªãããå¯èœæ§ããããŸãã
nodejsã®Axiosã§
form-data
ããã±ãŒãžã䜿çšããããšãã§ããŸããã åºæ¬çã«FormData
ãããªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã ãã ããçæãããããããŒãæåã§Axiosã«æž¡ãããã«æ³šæããå¿ èŠããããŸãã äŸãã°ïŒ