htmlのformには、action属性にgetとpostしか取れないため、deleteやputなどを指定できない。ではどうすれば、良いかというと、例えば、phpでは
<form>
<input type="hidden" name="_method" value="PATCH">
</form>
を書き入れればphp側でよしなに、処理してくれ、patchメソッドが走るようにしてくれている。
しかし、goでは同じように書いても動くわけがなく、上記の仕組みを自分で作成する必要がある。
では、どのようにすればいいかと言うと、routerのprocessが走る前に、処理されるmiddlewareを用意しなければならない。以下、golangのechoを使用しますが、フレームワークを使わなくてもほぼ同じです。
まず、main関数内で以下のようにMethodOverrideを読み込みます。
e.Pre(controllers.MethodOverride)
これで、routerが走る前に最初に動かせます。私は、最初e.Useでも動くと思っていたのですが、うごかず積みました。公式にも、methodOverRideにはe.Preを使えと書いてありました。
で、読み込むmiddleWareですが、以下のような関数になります。
func MethodOverride(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if c.Request().Method == "POST" {
method := c.Request().PostFormValue("_method")
if method == "PUT" || method == "PATCH" || method == "DELETE" {
c.Request().Method = method
}
}
fmt.Println(c.Request())
return next(c)
}
}
つまり、Postメソッドが動いた際に、if以下が処理されます。methodに自分が使いたいhttp method(putやdelete,patchなど)を代入し、requestのmethodを書き換えてやります。そしてチェインさせて、次の関数を呼び出します。
adminGroup.PATCH("/update", controllers.UpdateAdminUser)
以上です。
この記事に標準パッケージのみを使った同様の方法が書いてあります。
https://www.alexedwards.net/blog/http-method-spoofing