GolangでシンプルなREST APIを書く
こんにちは😀
この簡単な記事では、いくつかのベストプラクティスをフォローしようとするゴランを使用してREST APIを書く方法を説明します.
必要に応じて続くソースコードはhere .
これをしましょう👍🏻
例として、非常にシンプルなポストAPIを作成します.
プロジェクトの構造
私たちの端末にジャンプし、プロジェクトのための新しいディレクトリを作成し、initの移動モジュールをしましょう.
次に、パッケージアプリケーションを作成します
我々のアプリの構造を表す** app struct * *を作成するつもりです.この構造の2つのフィールドがあります、我々のアプリは、dBとルータを持っています.
ルータはgorilla/mux ルータので、先に行きましょう.
今、我々はstructに基づいて実際のアプリケーションを返すのを担当するnew () funcを作成するつもりです.
今我々
OK、アプリのエントリポイントは、ルーティングを続行しましょう構造化されます.
ルーティング
我々は基本的なルーティングを実装する前に定義した我々のアプリのルータを使用してみましょう.
我々の中で
すぐにNILを我々のインデックスルートの単純なハンドラーと交換しましょう.そのために
では、このハンドラを私たちのルートに呼び出しましょう.
完璧な、これをテストするには、我々は
を、今我々はアプリを実行することができます
涼しい、ルーティングは働いているようです!
データベース
私たちのデータベースを設定する時間です.私はPostgreSQLを使用して、ローカルセットアップを避けるためにDockerコンテナでデータベースを実行することを選択しました.
以下のコマンドを使います.
を作成しましょう
我々はまた、タイプの1つのフィールドDBを持っている我々のアプリのようなDBの構造を持っているつもりですsqlx DB Go標準ライブラリからのデータベース/SQLのスーパーセットのようです.Sqlxとlib/pq ( Postgres SQLドライバ)を取得して実行しましょう.
open ()とclose ()の本文を書く前に、app - structにデータベースフィールドを追加することができます
私たちのopenメソッドから始めましょう.Postgresデータベースに新しい接続を開きましょう.
この接続を確立するには、SQLXの2番目の引数を指定します.open ()メソッドはPostgres接続文字列です.この文字列を
私がしたいもう一つは、接続後に実行されるSQLスキーマを作成することです.このスキーマは、1つでない場合には、DBのテーブルポストを作成します.これをAに加えましょう
閉じるこの動画はお気に入りから削除されています.sqlxからcloseメソッドを呼び出す必要があります
我々のデータのためにいくつかのメソッドを書く前に
走りましょう
データベースは構成されていますが、あまり完成していません.なぜなら、createpostやgetpostのようなメソッドを実装したいという点ですが、そのためには、post - modelが必要です.
モデル
先に行くと、アプリケーションパッケージの内部に新しいパッケージモデルを作成し、Aを作成する
これはREST APIであるので、後にJSONへの応答をマッピングすることになります.そして、時々私たちのデータベースからのフィールドは私たちのJSONフィールドに対応しないかもしれませんし、新しいフィールドを追加したりフィールドを削除するための柔軟性を持ちたいかもしれません.
そのためには、すでにJSONPOST構造体を作成しましょう.
最後に、このファイルを追加したいのは数秒で役に立つでしょう.私たちがデータベースにポストを加えるとき、IDは自動インクリメントされます.そして、新しいポストを作成する要求をするとき、我々はIDを通過する必要はありません.では、そのためにpostrequest structを作成しましょう.
我々のデータベースに戻ってください
注意:すべての残りの動詞のエンドポイントを実装することはありません.
我々の中で
を作成しましょう
HTTPハンドラ
我々のデータベースと対話するために、我々のメソッドのすべてを持っている今、我々は、indexhandlerの前に我々のHTTPハンドラを書きましょう.我々の中で
私たちがしようとしているのは、空のpostrequest構造体を初期化することです.リクエスト本文をパースしたりマップしたりするには、ヘルパーfuncを書くつもりです
再び、これはREST APIですので、HTTPステータスを送信するのは良い習慣です.私たちはHTTPステータスで多くのレスポンスを送るつもりです、したがって、私はこのためにもう一つのヘルパーFuncを書きます
ところで、我々はその柔軟性を望む場合は、JSONPOST構造を持っていた覚えていますか?最後のヘルパー機能を加えましょう
CreatePostHandlerを続けて、リクエスト本文を解析したので、そのデータを使用して新しいポストを作成し、データベースに保存する必要があります.
今すぐCreatePasssHandlerを終了するには、ちょうど我々のfunc initrouteの新しいルートを作成する必要がありますから
ラン
働いているようです👍🏻
テストに移る前に、より簡単でなければならないgetposthandlerを実装しましょう.
アプリをリニューッチ
不眠症で検査する
これは完璧です🙂
テスト
また、我々は我々のアプリにテストカバレッジを追加しようとする必要がある理由ですので、我々のコードをテストするために非常に良い練習です.そのためには、テストパッケージを作成し、テストするファイルのテストファイルを追加できます
私は実際にvideo そして、Golangでテストを実装することについて書きました🙂
結論
それだ!私はここでこの記事を止めるつもりです、私は改善の余地があるということを知っています、しかし、私はこれを短くして、ちょうど基礎について話したかったです.
いつものようにフィードバックを与えることを躊躇しないように、今日の開発者の役割は、改善し続けることであり、それは私がしたいことです🙂
私をチェックすることを躊躇しないでください、そして、あなたは私の上で私に連絡することができます、そして、もちろん、私はリンクしますgithub repository この記事のために.
すぐにお会いしましょう!👋🏻
この簡単な記事では、いくつかのベストプラクティスをフォローしようとするゴランを使用してREST APIを書く方法を説明します.
必要に応じて続くソースコードはhere .
これをしましょう👍🏻
例として、非常にシンプルなポストAPIを作成します.
プロジェクトの構造
私たちの端末にジャンプし、プロジェクトのための新しいディレクトリを作成し、initの移動モジュールをしましょう.
mkdir postapi
cd postapi
go mod init postapi
注意:モジュールネーミングのベストプラクティスは<domain>/<nameOfApp>
我々がこれを持っているので、我々の大好きなコードエディタで我々のプロジェクトを開いて、Aをつくりましょうmain.go
パッケージメインのファイル.これは、我々のアプリケーションのエントリポイントになります.次に、パッケージアプリケーションを作成します
app.go
ファイル
我々のアプリの構造を表す** app struct * *を作成するつもりです.この構造の2つのフィールドがあります、我々のアプリは、dBとルータを持っています.
ルータはgorilla/mux ルータので、先に行きましょう.
go get -u github.com/gorilla/mux
それを我々の構造に加えましょう
今、我々はstructに基づいて実際のアプリケーションを返すのを担当するnew () funcを作成するつもりです.

今我々
main.go
ファイルは、この関数を呼び出すことができますし、新しいアプリケーションを作成します.
OK、アプリのエントリポイントは、ルーティングを続行しましょう構造化されます.
ルーティング
我々は基本的なルーティングを実装する前に定義した我々のアプリのルータを使用してみましょう.
我々の中で
app.go
ファイルを作成するときには、initroute funcを作成します.この関数は、我々のアプリの受信機になります.実際に我々のアプリの多くは我々は今から我々のアプリから受信されます.我々のStructアプリの我々のルータ分野がタイプgorilla/mux ルータ我々はそれの方法にアクセスしている.
すぐにNILを我々のインデックスルートの単純なハンドラーと交換しましょう.そのために
handlers.go
我々のパッケージアプリのファイル.これは、我々が我々のルートのためにハンドラを保存するところです.HTTPを返すindex xhandler ()ハンドラを作成します.レスポンスを印刷してください.
では、このハンドラを私たちのルートに呼び出しましょう.

完璧な、これをテストするには、我々は
main.go
ファイルは我々の選択のポート上のアプリを提供し、我々のアプリのルータにリダイレクト.また、エラー処理でヘルプを印刷するチェック機能を作りました.
を、今我々はアプリを実行することができます
go run main.go
そして、エンドポイントを呼び出してレスポンスを受け取るかどうかを確認します.curl http://localhost:9000

涼しい、ルーティングは働いているようです!
データベース
私たちのデータベースを設定する時間です.私はPostgreSQLを使用して、ローカルセットアップを避けるためにDockerコンテナでデータベースを実行することを選択しました.
以下のコマンドを使います.
docker run --name postapidb --env POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres
注:停止するにはdocker stop postapidb
そして削除するdocker rm postapidb
さて、今、我々はコードにジャンプして、我々のアプリケーションパッケージの中に新しいパッケージデータベースを作成しているデータベースを持っています.を作成しましょう
db.go
ファイルと内部のインターフェイスがあります.私はそれを呼ぶつもりですPostDB
, このインターフェイスは、我々のデータベースをPostDBデータベースにしたいなら、私たちが尊重しなければならないコントラクト(実装する方法)のようです.Postdbはopen ()とエラーを返すことができるcloseメソッドを実装すべきだということから始めましょう.我々はまた、タイプの1つのフィールドDBを持っている我々のアプリのようなDBの構造を持っているつもりですsqlx DB Go標準ライブラリからのデータベース/SQLのスーパーセットのようです.Sqlxとlib/pq ( Postgres SQLドライバ)を取得して実行しましょう.
go get -u github.com/jmoiron/sqlx
go get -u github.com/lib/pq

open ()とclose ()の本文を書く前に、app - structにデータベースフィールドを追加することができます
app.go
我々はこのアプリでPostDBを使用していると言う🙂
私たちのopenメソッドから始めましょう.Postgresデータベースに新しい接続を開きましょう.

この接続を確立するには、SQLXの2番目の引数を指定します.open ()メソッドはPostgres接続文字列です.この文字列を
config.go
データベースパッケージ内にあります.

私がしたいもう一つは、接続後に実行されるSQLスキーマを作成することです.このスキーマは、1つでない場合には、DBのテーブルポストを作成します.これをAに加えましょう
schemas.go
ファイル.

閉じるこの動画はお気に入りから削除されています.sqlxからcloseメソッドを呼び出す必要があります

我々のデータのためにいくつかのメソッドを書く前に
main.go
ファイルとinitデータベースへの接続.
走りましょう
go run main.go

データベースは構成されていますが、あまり完成していません.なぜなら、createpostやgetpostのようなメソッドを実装したいという点ですが、そのためには、post - modelが必要です.
モデル
先に行くと、アプリケーションパッケージの内部に新しいパッケージモデルを作成し、Aを作成する
post.go
ファイル.その中に4つのフィールドを持つポスト構造があります.
これはREST APIであるので、後にJSONへの応答をマッピングすることになります.そして、時々私たちのデータベースからのフィールドは私たちのJSONフィールドに対応しないかもしれませんし、新しいフィールドを追加したりフィールドを削除するための柔軟性を持ちたいかもしれません.
そのためには、すでにJSONPOST構造体を作成しましょう.

最後に、このファイルを追加したいのは数秒で役に立つでしょう.私たちがデータベースにポストを加えるとき、IDは自動インクリメントされます.そして、新しいポストを作成する要求をするとき、我々はIDを通過する必要はありません.では、そのためにpostrequest structを作成しましょう.

我々のデータベースに戻ってください
db.go
ファイルはPostdbインターフェース、getpost、createpostに2つのメソッドを追加します.注意:すべての残りの動詞のエンドポイントを実装することはありません.

我々の中で
schemas.go
ファイルを作成します.
を作成しましょう
methods.go
ファイルを作成し、メソッドを書き込みます.
HTTPハンドラ
我々のデータベースと対話するために、我々のメソッドのすべてを持っている今、我々は、indexhandlerの前に我々のHTTPハンドラを書きましょう.我々の中で
handlers.go
ファイルを作成します.私たちがしようとしているのは、空のpostrequest構造体を初期化することです.リクエスト本文をパースしたりマップしたりするには、ヘルパーfuncを書くつもりです
helpers.go
ファイル.

再び、これはREST APIですので、HTTPステータスを送信するのは良い習慣です.私たちはHTTPステータスで多くのレスポンスを送るつもりです、したがって、私はこのためにもう一つのヘルパーFuncを書きます
helpers.go
ステータスをJSONレスポンスで送信するファイル.

ところで、我々はその柔軟性を望む場合は、JSONPOST構造を持っていた覚えていますか?最後のヘルパー機能を加えましょう
helpers.go
) データをその構造体にマップするだけです.
CreatePostHandlerを続けて、リクエスト本文を解析したので、そのデータを使用して新しいポストを作成し、データベースに保存する必要があります.

今すぐCreatePasssHandlerを終了するには、ちょうど我々のfunc initrouteの新しいルートを作成する必要がありますから
app.go
ファイルを呼び出してハンドラを呼び出します.
ラン
go run main.go
もう一度試してみましょうInsomnia .
働いているようです👍🏻
テストに移る前に、より簡単でなければならないgetposthandlerを実装しましょう.


アプリをリニューッチ

不眠症で検査する

これは完璧です🙂
テスト
また、我々は我々のアプリにテストカバレッジを追加しようとする必要がある理由ですので、我々のコードをテストするために非常に良い練習です.そのためには、テストパッケージを作成し、テストするファイルのテストファイルを追加できます
handler_test.go
or db_test.go
.
私は実際にvideo そして、Golangでテストを実装することについて書きました🙂
結論
それだ!私はここでこの記事を止めるつもりです、私は改善の余地があるということを知っています、しかし、私はこれを短くして、ちょうど基礎について話したかったです.
いつものようにフィードバックを与えることを躊躇しないように、今日の開発者の役割は、改善し続けることであり、それは私がしたいことです🙂
私をチェックすることを躊躇しないでください、そして、あなたは私の上で私に連絡することができます、そして、もちろん、私はリンクしますgithub repository この記事のために.
すぐにお会いしましょう!👋🏻
Reference
この問題について(GolangでシンプルなREST APIを書く), 我々は、より多くの情報をここで見つけました https://dev.to/lucasnevespereira/write-a-rest-api-in-golang-following-best-practices-pe9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol