実現したいこと
ElectronアプリでWeb APIにAxiosのPOSTを投げたい
送りたいデータはCSVでmultipart/form-dataの形式でPOSTする必要があります。(POST先のサーバ指定)
困っていること
AxiosでのPOSTのHTTPリクエストの形が求める形にならず困っています。
データはform-dataライブラリを使って設定しています。
求める形と現状
この形にしたい
↓ARC(HTTPリクエストを送るソフト)で送って期待通りに動作した時のWiresharkのログ
MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "--------------------------332315644361122399636534" [Type: multipart/form-data] First boundary: ----------------------------332315644361122399636534\r\n Encapsulated multipart part: (application/vnd.ms-excel) Content-Disposition: form-data; name="aaaaabc3332"; filename="putjobCSV.csv"\r\n Content-Type: application/vnd.ms-excel\r\n\r\n Media Type Media type: application/vnd.ms-excel (189 bytes) Last boundary: \r\n----------------------------332315644361122399636534--\r\n
現状
↓Axios POSTを使った時のWiresharkのログ
※1
MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "--------------------------317363921338863873185030" [Type: multipart/form-data] Data (17 bytes) Data: 5b6f626a65637420466f726d446174615d [Length: 17]
↓form-dataライブラリのsubmitを使った時のログ(Axiosのセッション情報が引き継げないためセッションエラー)
※2
MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "--------------------------110980606495398123589222" [Type: multipart/form-data] First boundary: ----------------------------110980606495398123589222\r\n Encapsulated multipart part: (text/csv) Content-Disposition: form-data; name="eeeeleleele"; filename="electron"\r\n Content-Type: text/csv\r\n\r\n Media Type Media type: text/csv (189 bytes) Last boundary: \r\n----------------------------110980606495398123589222--\r\n
ソースコード
const fs = require('fs').promises; const axios = require('axios').default; const FormData = require('form-data'); import { AxiosResponse, AxiosError } from 'axios'; // ****** 処理部分を抜粋 ******** let csvFile: any; promiseFileOpen(file) .then(res => { console.log('AAA ## ' + res); csvFile = res; let url = ''; url += config.URL+ 'post'; console.log(url); const formData = new FormData(); formData.append('foo', csvFile, { filename: 'myCSV', contentType: 'text/csv', }); //※2の部分 formData.submit(url, (err: any, res: any) => { if (err) console.log('formdata submit Error'); console.log(res.statusCode); }); //※1の部分 (async () => { await axios .post(url, formData, { headers: { // 'content-type': 'multipart/form-data', ...formData.getHeaders(), }, }) .then((response: AxiosResponse) => { console.log('AxiosResponse->' + response.data); }) .catch((error: AxiosError) => { console.log('axios error =>' + error); }); })(); }) .catch(err => console.log('Error'));
丸一日以上格闘していますが解決できていません。。
よろしくお願いいたします
回答2件
あなたの回答
tips
プレビュー