[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
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!