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

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

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

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

Q&A

解決済

2回答

9688閲覧

axios deleteメソッドの際にbodyが送れない

muteki_gamer

総合スコア157

JavaScript

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

0グッド

0クリップ

投稿2020/10/05 03:26

現在REST APIを作成しています。削除の機能の際にdeleteメソッド使用しサーバー側を実装しました。
Postmanにて確認したところbodyにjson形式でidを送ることが出来ました。
しかし、axiosを使ってフロントと結合しようとしたところ、うまく送ることができませんでした。

下が該当コードです。

js

1axios 2 .delete(process.env.apiAdminBaseUrl + '/user', { 3 data: { id : 1 } 4 }) 5 .then((res) => { 6 console.log(res); 7 this.data.splice(this.editedIndex, 1); 8 this.closeDelete(); 9 });

axiosで送った際のレスポンス

{data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, …} config: {url: "http://localhost:8000/admin/user", method: "delete", headers: {…}, transformRequest: Array(1), transformResponse: Array(1), …} data: id: null

paramsによる送信はうまくいきました。
deleteメソッドの際はdataキーで送ることは見つかりましたが、それでもうまくいきませんでした。
何か分かる方がいましたらお力添えいただきたいです。

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

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

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

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

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

guest

回答2

0

何か分かる方がいましたらお力添えいただきたいです

まずは調べる機会を頂き、感謝します。
私の判断は、「DELETE要求時にbodyは送れない」というものです。RFC7231 DELETE を参考にしました(DELETEセクション4段落目後半)。

以下、Google翻訳の結果を引用します。

原文

A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request. Responses to the DELETE method are not cacheable. If a DELETE request passes through a cache that has one or more stored responses for the effective request URI, those stored responses will be invalidated (see Section 4.4 of [RFC7234]).

訳文

DELETE要求メッセージ内のペイロードには定義されたセマンティクスがありません。 DELETE要求でペイロード本体を送信すると、一部の既存の実装が要求を拒否する可能性があります。 DELETEメソッドへの応答はキャッシュできません。 DELETEリクエストが、有効なリクエストURIに対する1つ以上の応答が保存されているキャッシュを通過すると、それらの保存された応答は無効になります([RFC7234]のセクション4.4を参照)。

ペイロード本体(つまり、ご質問の body)と解釈しました。


RFCは、仕様書とは一味違う「標準を提案する」文書です。
「現状はこのように利用されていたが、こんな風に変えてはどうか?」という議論の集積ですので、
ここに記述される実装を無視した サーバー、クライアントを実装すれば可能になるのも事実です。

追記)
gitHub axios.jsxhrAdapter(config) を眺めていると 1000行付近で new XMLHttpRequest() が確認できました(IE対応のため XHRを使っている)。
全体として、axios は Promise で処理できるように、また簡単にコンフィグを指定できるようにしたXHRラッパーに過ぎないので、XHRfetchのネイティブなコードも試してみるのも良いかもしれません~~(XHR や fetchといった、ブラウザに実装されたHTTP通信機能が DELETE要求するときに body を null にしている可能性もありますが、未確認です)~~。

追記2)
axios 及び、ネイティブ実装(fetchの使用) にて確認:ブラウザ側の開発者コンソール(Networkタブ-Headers)では、Request Payload としてbody が表示され、「送信」されていました。
私の環境(KoaJS + koa-body)では、サーバー側で DELETEメソッドにおいても、Payload Bodyを解析するように設定する必要がありました。

  • 回答例に挙げた koa-body では options.strict=false または options.parsedMethods=[許可するメソッドのホワイトリスト] でペイロード本体の解析対象メソッドを選択します。(gitHub:koa-body/../index.js#59-#78

同様にサーバー側の実装を再確認してみてはどうでしょうか。

投稿2020/10/10 06:36

編集2020/10/11 00:04
AkitoshiManabe

総合スコア5434

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

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

muteki_gamer

2020/10/11 13:24

ご回答ありがとうございます。返信が遅くなり申し訳ありません。 非常に興味深く参考になりました。もう片方の方の回答にあるようにrequestメソッドでmethodにdeleteを指定してあげると本体を受け取ることができました。なのでサーバー側なのかな?という感じです。 機会があるときにもう少し原因を探してみます。
guest

0

ベストアンサー

初めまして!

axios.request({ method: 'delete', url: process.env.apiAdminBaseUrl + '/user', data: {id: 1}, })

もしかしたら、これで動くかもしれないです!

投稿2020/10/10 05:04

編集2020/10/10 05:07
suny

総合スコア48

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

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

muteki_gamer

2020/10/11 12:59

返信遅くなり申し訳ありません。こちらの実装を行ったところ動きました。 deleteメソッドで送れないのはaxiosの仕様って感じなんですかね...
muteki_gamer

2020/10/14 02:20

なるほど。このissueはすごい助かります。ありがとうざいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問