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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2799閲覧

[go, echo]htmlのform methodでのputの扱い

shoki_ohta

総合スコア20

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/12/22 04:29

以下ようにgolangのechoでルーティングを設定していて、
putメソッドで"/admin/update"にリクエストが来た際に、controllers.UpdateAdminUserを動かしたいのですが、
htmlのformでは、methodにputを使用できないため困っています。

イメージ説明

現在考えられる手段として、html form のpostメソッドで当該リクエストを飛ばし、methodをputにオーバライドさせるのが良いのかなと考えているのですが、方法がわかりません。
またベストプラクティスなのかもわからないです。

有識者の方の回答をお待ちしています。

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

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

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

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

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

guest

回答2

0

自己解決

htmlのformには、action属性にgetとpostしか取れないため、deleteやputなどを指定できない。ではどうすれば、良いかというと、例えば、phpでは

html

1<form> 2 <input type="hidden" name="_method" value="PATCH">
</form> ```

を書き入れればphp側でよしなに、処理してくれ、patchメソッドが走るようにしてくれている。
しかし、goでは同じように書いても動くわけがなく、上記の仕組みを自分で作成する必要がある。

では、どのようにすればいいかと言うと、routerのprocessが走る前に、処理されるmiddlewareを用意しなければならない。以下、golangのechoを使用しますが、フレームワークを使わなくてもほぼ同じです。

まず、main関数内で以下のようにMethodOverrideを読み込みます。

go

1e.Pre(controllers.MethodOverride)

これで、routerが走る前に最初に動かせます。私は、最初e.Useでも動くと思っていたのですが、うごかず積みました。公式にも、methodOverRideにはe.Preを使えと書いてありました。

イメージ説明

で、読み込むmiddleWareですが、以下のような関数になります。

go

1func MethodOverride(next echo.HandlerFunc) echo.HandlerFunc { 2 return func(c echo.Context) error { 3 if c.Request().Method == "POST" { 4 method := c.Request().PostFormValue("_method") 5 if method == "PUT" || method == "PATCH" || method == "DELETE" { 6 c.Request().Method = method 7 } 8 } 9 fmt.Println(c.Request()) 10 return next(c) 11 } 12}

つまり、Postメソッドが動いた際に、if以下が処理されます。methodに自分が使いたいhttp method(putやdelete,patchなど)を代入し、requestのmethodを書き換えてやります。そしてチェインさせて、次の関数を呼び出します。

go

1adminGroup.PATCH("/update", controllers.UpdateAdminUser)

Qiitaで同様の記事を書きました。
https://qiita.com/shoking/items/4e26b5438c3437400f53

投稿2018/12/22 10:10

shoki_ohta

総合スコア20

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

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

0

Goのことはわかりませんが、PUT/DELETEなどformがサポートしていないmethodを送信したい場合、下記のような方法があるようです。

投稿2018/12/22 07:55

編集2018/12/22 07:55
m.ts10806

総合スコア80850

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

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

shoki_ohta

2018/12/22 10:12

ありがとうございます。 いただいた記事はphpでの方法ですね! goではその仕組みを自前で用意する必要がありました。 なんとか自力で解決できました、、、
m.ts10806

2018/12/22 10:14

phpだけの話ではないですよ。 webサーバーのリクエスト全般に言えるものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問