[beego初心者入門]webフレームワーク-beegoに基づくRESTful APIの構築の旅
13878 ワード
前言
beegoはGOアプリケーションを迅速に開発するhttpフレームワークであり、著者はgo言語方向の大牛、astaxieである.beegoはAPI、web、バックエンドサービスなどのアプリケーションを迅速に開発するために使用することができ、RESTFulスタイルのフレームワークであり、主な設計インスピレーションはPython web開発フレームワークtornado、flask、sinstraから来ており、Go言語自体のいくつかの特性(interface、struct継承など)をよく結合している.
beegoは8つの独立したモジュールに基づいて実現され,ユーザがhttpの論理を使用しなくても,その中の各モジュールをうまく使用することができるモジュール間のデカップリングをよく実現した.著者自身は、彼のこのような考えはレゴの積み木から来ており、beegoを設計するとき、これらのモジュールは積み木であり、最終的に構築されたロボットはbeegoだと話しています.
このブログではbeegoを使ってAPIを構築し、実現過程の詳細と遭遇したいくつかの穴を説明し、すぐにbeegoのAPI構築の旅を始めましょう.
プロジェクトの作成
あなたの$GOPATH/srcに入ってbeego開発パッケージをインストールして自分で急速にツールを開発します
クイック開発ツールbeeを使用して、APIプロジェクトを作成します.
私たちが得たプロジェクト構造は次の図のようになります.
これは典型的なMVCアーキテクチャの応用であることがわかり、beegoは私たちのプロジェクトに必要ないくつかを準備しています.例えば、プロファイルconf、テストファイルtestsなど、APIコードの作成に専念すればいいだけです.
プロジェクトを実行し、API自動化ドキュメントを取得
上記のコード出力を次の図に示します.
ブラウザで
models設計
データベースobject操作には、4つの方法
他にもbeegoの公式ドキュメントを参照する方法があり、orm操作について詳しく紹介されています.
データベースを作成し、データベース・テーブルを設計します.
Modelsフォルダの下に新しいファイルStudentを作成します.go、次のコードを実装します.コードのキーにはコメントpackage modelsがあります.
//modelsモジュールでstructを作成します.beegoのormフレームワークを使用して、structをデータベースのフィールドと対応付けます.
modelという層は主にstructを定義し,上位層のために読み書きデータベースを記述する.データを処理するコード.
コントロール層実装
beegoベースのController設計は、以下に示すように匿名の組合せ
この関数は主にContext、対応するController名、テンプレート名、テンプレートパラメータを初期化するコンテナData、appは現在実行されているControllerのreflecttypeであり、このappはサブクラスのメソッドを実行するために使用することができる.
この関数は主にユーザ拡張のために用いられ,この関数は以下で定義するこれらのMethodメソッドの前に実行され,ユーザはこの関数を書き換えてユーザ検証のようなものを実現することができる.
ユーザが要求するHTTP MethodがGETである場合、関数は実行され、デフォルトは405であり、ユーザが継承するサブstructではGet要求を処理するためにこの方法が実装され得る.
ユーザが要求するHTTP MethodがPOSTである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Post要求を処理するためにこの方法が実装され得る.
ユーザが要求するHTTP MethodがDELETEである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Delete要求を処理するためにこの方法が実装され得る.
ユーザが要求するHTTP MethodがPUTである場合、この関数が実行する、デフォルトは405であり、ユーザが継承するサブstructにおいてPut要求を処理するための方法が実現される.
ユーザが要求するHTTP MethodがHEADである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Head要求を処理するためにこの方法が実装され得る.
ユーザが要求するHTTP MethodがPATCHである場合、この関数が実行する、デフォルトは405であり、ユーザが継承するサブstructでは、Patch要求を処理するための方法が実現される.
ユーザが要求するHTTP MethodがOPTIONSである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Options要求を処理するためにこの方法が実現される.
この関数は、対応するHTTP Methodメソッドを実行した後に実行されます.デフォルトは空です.ユーザーは、データベースの停止、データのクリーンアップなどの作業をサブstructで書き換えることができます.
この関数は主にbeego.AutoRenderがtrueの場合のみ実行されます.
したがって,サブstructの方法で書き換えることで,ユーザは自分の論理を実現することができる.
routersレイヤはルーティング設定とは何ですか?前述したMVC構造の実行時にbeegoには,固定ルーティング,正規ルーティング,自動ルーティングの3つの方式があり,RESTFul APIに関連するのが固定ルーティングと正規ルーティングである.
次に、固定ルーティングの例を示します.
次に、正規ルーティングの例を示します.
デフォルトマッチング//例えばURLについて//api/123」はマッチングに成功し、変数":id"の値は"123"である.
デフォルトの照合//例えばURLについて//api/123」は照合に成功し、変数:idの値は「123」であるが、URL/api/「照合に失敗した」
カスタム正規マッチング//例えばURLについて「/api/123」はマッチングに成功し、変数「id」の値は「123」である.
beego.Router(“/user/:username([\w]+)“, &controllers.RController{})
beego.Router(“/download/.”, &controllers.RController{})
*照合方法//例えばURLについて//download/file/api.xmlは正常に一致しました.変数::pathの値は「file/api」、「:ext」の値は「xml」です.
*フルマッチング//例えばURL/download/ceshi/file/api.json"は正常に一致し、変数":splat"の値は"file/apiである.json”
intタイプ設定方式、マッチング:idはintタイプで、フレームワークは正則を実現します([0-9]+)
stringタイプ設定方式、マッチング:hiはstringタイプです.フレームワークは正則を実現します([w]+)
接頭辞付きカスタム正規//マッチング:idは正規タイプです.マッチングcms_123.htmlのようなurl:id=123
個人的には、Pythonフレームワークflaskのような注釈ルーティングが最も便利で、このプロジェクトでも使用されています.
routers/routers.goに希望のAPIを追加
上記のコードは、以下のAPIを実現しています.
非常にはっきりしている.
main.goのデータベース構成
キーは、コードにコメントとして表示されます.
postmanテスト
bee runがコードを実行した後、postmanを使用して構築したAPIの効果をテストします.
ここでは紙面を節約し,1つのインタフェースだけをテストする.
ここまでbeegoに基づいて簡単なAPIインタフェースの構築を実現してきましたが、はっきりしていて簡単ではないでしょうか.早く自分でやってみよう.
コードはGitHubにアップロードされており、
beegoはGOアプリケーションを迅速に開発するhttpフレームワークであり、著者はgo言語方向の大牛、astaxieである.beegoはAPI、web、バックエンドサービスなどのアプリケーションを迅速に開発するために使用することができ、RESTFulスタイルのフレームワークであり、主な設計インスピレーションはPython web開発フレームワークtornado、flask、sinstraから来ており、Go言語自体のいくつかの特性(interface、struct継承など)をよく結合している.
beegoは8つの独立したモジュールに基づいて実現され,ユーザがhttpの論理を使用しなくても,その中の各モジュールをうまく使用することができるモジュール間のデカップリングをよく実現した.著者自身は、彼のこのような考えはレゴの積み木から来ており、beegoを設計するとき、これらのモジュールは積み木であり、最終的に構築されたロボットはbeegoだと話しています.
このブログではbeegoを使ってAPIを構築し、実現過程の詳細と遭遇したいくつかの穴を説明し、すぐにbeegoのAPI構築の旅を始めましょう.
プロジェクトの作成
あなたの$GOPATH/srcに入ってbeego開発パッケージをインストールして自分で急速にツールを開発します
bee
go get github.com/astaxie/beego
go get github.com/astaxie/beego/orm
go get github.com/beego/bee
クイック開発ツールbeeを使用して、APIプロジェクトを作成します.
bee new firstAPI
私たちが得たプロジェクト構造は次の図のようになります.
これは典型的なMVCアーキテクチャの応用であることがわかり、beegoは私たちのプロジェクトに必要ないくつかを準備しています.例えば、プロファイルconf、テストファイルtestsなど、APIコードの作成に専念すればいいだけです.
プロジェクトを実行し、API自動化ドキュメントを取得
bee run -gendoc=true -downdoc=true
上記のコード出力を次の図に示します.
ブラウザで
: IP:8080/swagger
にアクセスすると、swaggerのAPIドキュメントが表示されます.コードが更新されると、ドキュメントが自動的に更新され、便利になります.models設計
データベースobject操作には、4つの方法
Read / Insert / Update / Delete
のサンプルコードがあります.o := orm.NewOrm()
user := new(User)
user.Name = "slene"
fmt.Println(o.Insert(user))
user.Name = "Your"
fmt.Println(o.Update(user))
fmt.Println(o.Read(user))
fmt.Println(o.Delete(user))
他にもbeegoの公式ドキュメントを参照する方法があり、orm操作について詳しく紹介されています.
データベースを作成し、データベース・テーブルを設計します.
CREATE TABLE IF NOT EXISTS `student` (
`Id` int(11),
`Name` varchar(255),
`Birthdate` varchar(255),
`Gender` bool,
`Score` int(11)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Modelsフォルダの下に新しいファイルStudentを作成します.go、次のコードを実装します.コードのキーにはコメントpackage modelsがあります.
import (
"fmt"
"github.com/astaxie/beego/orm"
)
//modelsモジュールでstructを作成します.beegoのormフレームワークを使用して、structをデータベースのフィールドと対応付けます.
type Student struct {
Id int`orm:"column(Id)"` //column() , , API
Name string `orm:"column(Name)"`
BirthDate string `orm:"column(Birthdate)"`
Gender bool `orm:"column(Gender)"`
Score int `orm:"column(Score)"`
}
// student ,
func GetAllStudents() []*Student {
o := orm.NewOrm() // orm
o.Using("default") // , main.go orm.RegisterDataBase()
var students []*Student //
q := o.QueryTable("student")//
q.All(&students)//
return students
}
// student Id,
func GetStudentById(id int) Student {
u := Student{Id:id}// Id student
o := orm.NewOrm()//new orm
o.Using("default")// default
err := o.Read(&u)// Id=id student
if err == orm.ErrNoRows {
fmt.Println(" ")// , print
} else if err == orm.ErrMissPK {
fmt.Println(" ")
}
return u
}
// , student
func AddStudent(student *Student) Student {
o := orm.NewOrm()
o.Using("default")
o.Insert(student)//
return *student
}
func UpdateStudent(student *Student) {
o := orm.NewOrm()
o.Using("default")
o.Update(student)// student
}
func DeleteStudent(id int) {
o := orm.NewOrm()
o.Using("default")
o.Delete(&Student{Id:id})// id student
}
func init() {
orm.RegisterModel(new(Student))// orm
}
modelという層は主にstructを定義し,上位層のために読み書きデータベースを記述する.データを処理するコード.
コントロール層実装
beegoベースのController設計は、以下に示すように匿名の組合せ
beego.Controller
だけでよい.type xxxController struct {
beego.Controller
}
beego.Controller beego.ControllerInterface,beego.ControllerInterface :
Init(ct *context.Context, childName string, app interface{})
この関数は主にContext、対応するController名、テンプレート名、テンプレートパラメータを初期化するコンテナData、appは現在実行されているControllerのreflecttypeであり、このappはサブクラスのメソッドを実行するために使用することができる.
Prepare()
この関数は主にユーザ拡張のために用いられ,この関数は以下で定義するこれらのMethodメソッドの前に実行され,ユーザはこの関数を書き換えてユーザ検証のようなものを実現することができる.
Get()
ユーザが要求するHTTP MethodがGETである場合、関数は実行され、デフォルトは405であり、ユーザが継承するサブstructではGet要求を処理するためにこの方法が実装され得る.
Post()
ユーザが要求するHTTP MethodがPOSTである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Post要求を処理するためにこの方法が実装され得る.
Delete()
ユーザが要求するHTTP MethodがDELETEである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Delete要求を処理するためにこの方法が実装され得る.
Put()
ユーザが要求するHTTP MethodがPUTである場合、この関数が実行する、デフォルトは405であり、ユーザが継承するサブstructにおいてPut要求を処理するための方法が実現される.
Head()
ユーザが要求するHTTP MethodがHEADである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Head要求を処理するためにこの方法が実装され得る.
Patch()
ユーザが要求するHTTP MethodがPATCHである場合、この関数が実行する、デフォルトは405であり、ユーザが継承するサブstructでは、Patch要求を処理するための方法が実現される.
Options()
ユーザが要求するHTTP MethodがOPTIONSである場合、この関数が実行され、デフォルトは405であり、ユーザが継承するサブstructでは、Options要求を処理するためにこの方法が実現される.
Finish()
この関数は、対応するHTTP Methodメソッドを実行した後に実行されます.デフォルトは空です.ユーザーは、データベースの停止、データのクリーンアップなどの作業をサブstructで書き換えることができます.
Render() error
この関数は主にbeego.AutoRenderがtrueの場合のみ実行されます.
したがって,サブstructの方法で書き換えることで,ユーザは自分の論理を実現することができる.
routersレイヤはルーティング設定とは何ですか?前述したMVC構造の実行時にbeegoには,固定ルーティング,正規ルーティング,自動ルーティングの3つの方式があり,RESTFul APIに関連するのが固定ルーティングと正規ルーティングである.
次に、固定ルーティングの例を示します.
beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})
次に、正規ルーティングの例を示します.
beego.Router(“/api/?:id”, &controllers.RController{})
デフォルトマッチング//例えばURLについて//api/123」はマッチングに成功し、変数":id"の値は"123"である.
beego.Router(“/api/:id”, &controllers.RController{})
デフォルトの照合//例えばURLについて//api/123」は照合に成功し、変数:idの値は「123」であるが、URL/api/「照合に失敗した」
beego.Router(“/api/:id([0-9]+)“, &controllers.RController{})
カスタム正規マッチング//例えばURLについて「/api/123」はマッチングに成功し、変数「id」の値は「123」である.
beego.Router(“/user/:username([\w]+)“, &controllers.RController{})
// URL”/user/astaxie” , ”:username” ”astaxie”
beego.Router(“/download/.”, &controllers.RController{})
*照合方法//例えばURLについて//download/file/api.xmlは正常に一致しました.変数::pathの値は「file/api」、「:ext」の値は「xml」です.
beego.Router(“/download/ceshi/*“, &controllers.RController{})
*フルマッチング//例えばURL/download/ceshi/file/api.json"は正常に一致し、変数":splat"の値は"file/apiである.json”
beego.Router(“/:id:int”, &controllers.RController{})
intタイプ設定方式、マッチング:idはintタイプで、フレームワークは正則を実現します([0-9]+)
beego.Router(“/:hi:string”, &controllers.RController{})
stringタイプ設定方式、マッチング:hiはstringタイプです.フレームワークは正則を実現します([w]+)
beego.Router(“/cms_:id([0-9]+).html”, &controllers.CmsController{})
接頭辞付きカスタム正規//マッチング:idは正規タイプです.マッチングcms_123.htmlのようなurl:id=123
個人的には、Pythonフレームワークflaskのような注釈ルーティングが最も便利で、このプロジェクトでも使用されています.
routers/routers.goに希望のAPIを追加
package routers
import (
"firstAPI/controllers"
"github.com/astaxie/beego"
)
func init() {
ns := beego.NewNamespace("/v1",
beego.NSNamespace("/object",
beego.NSInclude(
&controllers.ObjectController{},
),
),
beego.NSNamespace("/user",
beego.NSInclude(
&controllers.UserController{},
),
),
beego.NSNamespace("/student",
beego.NSInclude(
&controllers.StudentController{},
),
),
)
beego.AddNamespace(ns)
}
上記のコードは、以下のAPIを実現しています.
/v1/object
/v1/user
/v1/student
非常にはっきりしている.
main.goのデータベース構成
package main
import (
_ "firstAPI/routers"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)// MySQL driver
orm.RegisterDataBase("default", "mysql", "root:test@tcp(127.0.0.1:3306)/restapi_test?charset=utf8")// 。
orm.RunSyncdb("default", false, true)
}
func main() {
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"//
}
beego.Run()
}
キーは、コードにコメントとして表示されます.
postmanテスト
bee runがコードを実行した後、postmanを使用して構築したAPIの効果をテストします.
ここでは紙面を節約し,1つのインタフェースだけをテストする.
ここまでbeegoに基づいて簡単なAPIインタフェースの構築を実現してきましたが、はっきりしていて簡単ではないでしょうか.早く自分でやってみよう.
コードはGitHubにアップロードされており、
bee run
にアップロードできます.Happy Coding!