APIのメソッドPUTとPATCHは何が違うのか調べてみた

PUTとPATCHの違いをあまり気にしてこなかった 基本的にフロントエンドなので、仕様書に書かれているメソッドでAPIと通信してきた。 ただ今回、自身が作る側に回り、PUTとPATCHの違いがいまいちピンとこなかったので、調べてみた。 結論 PUTはリソースの完全な置き換えで、PATCHはリソースの一部分のみを更新する場合とのこと。 例えば、 { "name": "John Doe", "age": 30, "email": "john@example.com" } というデータがあり、31歳に変更する場合を考えてみる。 PUTの場合 PUT /users/123 HTTP/1.1 Host: example.com Content-Type: application/json { "name": "John Doe", "age": 31, "email": "john@example.com" } といった感じに変更した年齢以外もまるっと送る必要がある。 PATCHの場合 対してPATCHの場合は、 PATCH /users/123 HTTP/1.1 Host: example.com Content-Type: application/json { "age": 31 } となる。 どっちを使うべきか まあ、この感じだと一部だけを更新したい場合はPATCHを使用するべきなんだと思うけど、その場合はフォームの一部だけが変更されたという監視が必要になるので、それなりの工数がかかる。そのためPUTでいいかなといった結論になりました。

投稿日 · 2024-05-01 · 更新日 · 2024-07-07 · 1 分 · nove-b

Go Langで作成したAPIをSwagger UIで表示する

タイトルにあるようにSwaggerで作成したいのであれば、yamlを作成すればいい。 だけど、そんなことをするのは面倒くさい。 というのもNestJsではデコレーターを追加するだけで自動でSwagger UIを作成してくれた。 そこでGoでも同様な手順で実現できるライブラリを探してみた。 swaggo/swag swaggo/swagを使えばできそうだったので試してみた。 インストール go install github.com/swaggo/swag/cmd/swag@latest アノテーションを作成する main.goにアノテーションを追加する。 // @title sample api // @version 1.0 // @description this is sample apigw // @host localhost:18080 // @BasePath /api/v1 // @tag.name accounts // @tag.description about accounts request func main() { handlers.HandleRequests() } 記入後にswag initを実行する。 . ├── docs.go ├── swagger.json └── swagger.yaml すると上記ファイルたちが生成される。 UIで確認する これがいまいちわかなかったので、https://editor.swagger.io/に生成されたyamlファイルをコピペして見る方法にしているけど、localhost:18080/api/v1で見られるんだと思われる。 …見れないので、要調査。 ⚠️ 違った。 localhost:18080/api/v1 上のURLはBaseURLだった。 まあ、問題ないので、いったん上記方法で行く。 追記:2023.12.30 Swagger ViewerVSCodeの拡張機能があった。 個別APIのアノテーションを作成する // GetAccount // @summary アカウントの情報を返します // @description user_idを元にアカウント情報を返します // @tags accounts // @produce json // @success 200 // @failure 401 // @router /accounts [get] func FetchUserById(w http....

投稿日 · 2023-12-28 · 更新日 · 2024-06-07 · 1 分 · nove-b

Go Langで新規登録のWebAPIを作成したので、認証周りをJWTで作成する。

期待するもの 新規登録のAPIを作成したので、次はログイン機能を作成したい。 ログインは、メールアドレスとパスワードを送り一致したら、tokenを取得する。 で、tokenを使って認証付きのAPIを叩けるようになりたい。 tokenにはjwtを使用する。 jwtってなに? これはどこかで調べてまとめる(気が向いた時)。 JWT認証を作成する パッケージのインストール github.com/dgrijalva/jwt-goパッケージの情報が多かったので、それに従うことにする。長い物には巻かれるべきで間違いない。 go get github.com/dgrijalva/jwt-go パッケージをインストールする。 Tokenを生成する まずjwt.goというファイルを作成する。 今回はauthフォルダの中に作成した。 それでは書いていく。 まずは、jwtを生成するためのシークレットキーを作成する。 var jwtKey = []byte("your_secret_key") ここでは任意の文字列(今回は"your_secret_key")をバイト列に変換し、jwtKeyに代入している。 バイト列というのがピンとこないので、 fmt.Printlnで書き出しみると、[121 111 117 114 95 115 101 99 114 101 116 95 107 101 121]となった。なんとなく理解した。 このようにして文字列をバイト列に変換することは、多くの場面でデータの操作や処理に利用されます。JWTの署名などのセキュリティ関連の操作では、シークレットキーをバイト列として扱うことが一般的です。 とのことでした。 次に、JWTのクレームを表す構造体であるClaimsを定義する。 これは任意のJSONデータっていう意味っぽい。 type Claims struct { Name string `json:"name"` jwt.StandardClaims } 今回はnameを含めることにする。 と思ったけど、ユニークで必要がありそうなので、ユーザーIDにした。 下記のように変更する。 type Claims struct { UserID uint `json:"user_id"` jwt.StandardClaims } 次に、Tokenを作成する関数を作成する。 コードの詳細はコメントアウトに書いた。 func generateToken(userId uint) (string, error) { // トークンの有効期限を設定(この場合は15分) expirationTime := time....

投稿日 · 2023-12-20 · 更新日 · 2024-06-07 · 2 分 · nove-b

Go Langで新規登録と退会のWebAPIを作成したので、やったことをまとめてみる。

いたるまで Go Lang で WebAPI を作成するために、まずは Docker で MySQL を構築する Go Lang で WebAPI を作成するために、Golang で MySQL に接続する Go Lang で WebAPI を作成するために、Golang でサーバーを立ち上げる Go Lang で WebAPI を作成するために、Golang でエンドポイントにアクセスし DB からデータを取得する Go Lang で WebAPI を作成するために、Golang で DB のデータを取得する main ファイルをそれぞれの責務に分割する ディレクトリ構成 . ├── db ├── db.go ├── handlers │ ├── auth │ │ ├── delete_user_handler.go │ │ └── create_user_handler.go │ └── handlers.go ├── models │ └── user_model.go └── main....

投稿日 · 2023-12-14 · 更新日 · 2024-06-07 · 4 分 · nove-b

Go LangでWebAPIを作成するために、GolangでDBのデータを取得するmainファイルをそれぞれの責務に分割する

Go LangでWebAPIを作成するために、GolangでエンドポイントにアクセスしDBからデータを取得するでデータ取得の処理は確認できた。 リファクタリング 次に現状、main.goにすべての記述をしていたが、それぞれ簡単に責務ごとにフォルダを分けることにした。 分け方は、下記の通り。 db フォルダ: データベース関連の処理: db フォルダは主にデータベースとのやり取りに関するコードを含みます。 データベースの初期化: db.go ファイルではデータベースの初期化と接続に関するコードがあります。 モデルの定義: データベースのテーブルに対応するモデルを定義します(例: db.Model)。 // db/db.go package db import ( "fmt" "os" "gorm.io/driver/mysql" "gorm.io/gorm" ) var DB *gorm.DB type Model struct { gorm.Model } func InitDB() { dsn := os.Getenv("DB_CONNECTION_STRING") if dsn == "" { fmt.Println("DB_CONNECTION_STRING 環境変数が設定されていません") os.Exit(1) } var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Printf("データベースへの接続に失敗しました: %v\n", err) os.Exit(1) } fmt.Println("データベースに接続しました") } handlers フォルダ: HTTP ハンドラとリクエスト処理: handlers フォルダは主に HTTP リクエストを処理し、それに対するレスポンスを生成するコードを含みます。 ルーティング: リクエストのルーティングやエンドポイントの定義が handlers....

投稿日 · 2023-12-05 · 更新日 · 2024-06-07 · 2 分 · nove-b