GolangでシンプルなREST APIを書く


こんにちは😀
この簡単な記事では、いくつかのベストプラクティスをフォローしようとするゴランを使用して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 この記事のために.
すぐにお会いしましょう!👋🏻