質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

2回答

6110閲覧

Axios POSTリクエストのbodyがおかしい

Reiz

総合スコア29

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/11/02 09:23

編集2020/11/04 00:29

実現したいこと

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'));

丸一日以上格闘していますが解決できていません。。
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plasticgrammer

2020/11/04 01:26

追加情報として、axios.postに渡している formData.getHeaders() の内容を記載頂けないでしょうか。
Reiz

2020/11/04 01:40

console.log(formData.getHeaders());としても[object Object]としか表示されないのですが、 form.getHeaders()の有無でWiresharkではMIMEタイプの項目の有無が変化しました。 MIMEタイプがなくなる代わりに以下の項目が表示されました。 ``` HTML Form URL Encoded: application/x-www-form-urlencoded Form item: "[object FormData]" = "" Key: [object FormData] Value: ```
plasticgrammer

2020/11/04 05:07

回答ありがとうございます。 あまり詳しくないのですが、FormDataがブラウザ側で使用できるものと同じものであれば、以下のコードで確認できるかもしれません。 console.log(...formData.entries());
Reiz

2020/11/04 05:36

レスありがとうございます。 axios.postの手前に追記して実行してみたのですが、 「TypeError: formData.entries is not a function」となってしまい確認できませんでした。(yyyyも表示されず) form-dataがnpmのライブラリなのでブラウザと同一ではないのが原因だと思います。 ``` console.log('xxxxxxx'); //追記 console.log(...formData.entries()); console.log('yyyyyyy'); //※1の部分 (async () => { ```
plasticgrammer

2020/11/04 05:47

確認ありがとうございました。エラーとのこと承知しました。 「axiosに引き渡しているヘッダ情報の違いにより問題が生じているのかも」と思い質問させて頂きました。 何かわかりましたら追記くださいますようお願いいたします。
guest

回答2

0

自己解決

Axiosではmultipart/formdataは送れないようです。
AxiosのGithubのissuesに情報がありました。
代替のライブラリとしてGithubのページではrequest-promiseの名前が挙がっていますが、
2019年時点で使用非推奨になっているため、got、superagentと試して結果superagentで目的を達成しました。

ご回答くださった方々ありがとうございました。

投稿2020/11/05 07:23

Reiz

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

EiichiCat

2022/03/29 13:39

相手のAPIによるのかもですが、似た現象に困っておりました。 代案のGOTに変えることで、解決しました。 助かりました🙏
guest

0

npm モジュールの form-data は ブラウザ実装を偽装したものです。
(npm のライブラリはNodeJS標準実装を活用したユーザ定義オブジェクトが公開されたものに過ぎない

OSSの本質は、「コードを読んで使えそうなら使ってください」ですので、作者が公開する Usage: を確認し、似たような使い方を試してみるのが一番です。

ご質問の //※1の部分 が、表題の axios との連携事例になると思います。

axios() の第二引数、第三引数にはバッファが渡るように独自メソッドを使うようなサンプルが示されています。

diff

1await axios 2- .post(url, formData, { 3- headers: { 4- // 'content-type': 'multipart/form-data', 5- ...formData.getHeaders(), 6- }, 7- }) 8+ .post( url, formData.getBuffer(), formData.getHeaders() )

を試してみてはどうでしょうか。

投稿2020/11/04 10:57

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Reiz

2020/11/05 07:17

レスありがとうございます。 OSSの本質を理解していませんでした。 世界中のたくさんの人たちが使い、issueを上げては直されているのだから動かないのは自分が間違っているからだと思ってました。 公式ドキュメント、英語だからと言って苦手意識を持たず読もうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問