[トップ]Golang+Mongodbを使ってあなたの最初の駅を作ります.
なぜGolangを使うと言いますか?Golangはダイナミックな言語の特徴がある静的な言語だからです.文法は簡単で、文法飴はなるべく文法を減らします.コンパイルするときには誤りをたくさん排除することができます.動態言語のように運行する時にピットに落ちなくてもいいです.
Golangの多くのWebフレームの中からMartiniが発見された.彼は後でこのフレームが多すぎる反射で効率に影響を与えたと思います.別のフレームを書いたり、作者の話によると「中間件」があります.Negroniといいます.具体的な開発原因はここを見ます.この作者はお酒が好きなのかもしれません.彼の書いた枠組みを飲み物の名前で呼んでいます.Marginという枠組みは、著者がExpresjsの啓発を受けて書いたものです.したがって、多くの使用上のものは非常に似ています.例えば、routeの結合文法や、中間部品の結合文法などをサポートしています.Golangの他のフレームも見たことがあります.例えばRevelは、多くのクールな機能とワンストップの多くのサポートがありますが、Martiniは柔軟にMarginを選択することを決めました.
データベースMongoDB
データベースについては、物事とデータの整合性に対する要求がそんなに強くないなら、比較的簡単なNoSQLデータベースを選んだほうがいいです.だから、MongoDBを使いました.厳格な仕事の中でこのように使うべきではないかもしれません.しかし、MongoDBはHttp POSTから来たjsonデータを直接データベースに書き込むだけで簡単にできます.Jsonが簡単だったら、設計は全然しなくてもいいです.もちろん、実際に働いている時はこのようなことができません.私たちが議論しているのはこのような実現可能性だけです.
じゃ、マーティンとモンブランでウェブアプリを作ります.このアプリの名前はナビゲートといいます.これらの問題の文脈情報は非常に限られています.したがって、ユーザーが携帯電話のクライアントを通じてnavigatorのインターフェースを呼び出して、関連するコンテキスト情報を同時に提出します.Golangに関する基本的なものはここでは検討しません.go getはMartiniを取得し、MongoDBをダウンロードします.その後は命令runを使ってMongoDBに来ます.DBに名前を付けます.NDB.そして中にdocumentを詰めます.MongoDBはinsert一つDcumentがないと、このデータベースは作成されていません.このDocmentはJsonです.フォーマットは:
{
"feedbackcode"
:
"123"
,
"username"
:
""
,
"phonenum"
:
""
,
"deviceinfo"
:
{
"systemtype"
:
""
,
"systemver"
:
""
,
"appver"
:
""
}
,
"imagelist"
:
[
]
,
"desc"
:
"testing"
,
"feedbacktype"
:
""
,
"other"
:
""
}
feedbackCode
は のfeedbackを しています.データベースの は に されました.
サイトのディレクトリ
たちのサイト を します.まずディレクトリ を べてみます.
navigator
|———conf
|-————–Conf.go #
|—————–ConfigError.go #
|———controllers
|—————–FeedbackController.go
|—————–IndexController.go
|–––models
|––––––FeedbackModel.go
server.go
REST API MVC 。 View, Html 。 , Model Controller。view , render json。
RUN
, web app 。 server.go :
package
main
import
"github.com/go-martini/martini"
func
main
(
)
{
m
:=
martini
.
Classic
(
)
m
.
Get
(
"/"
,
func
(
)
string
{
return
"Hello world!"
}
)
m
.
Run
(
)
}
go run server.go
コマンドでこのウェブアプリを させることができます.デフォルトでは3000ポートで します.ページ でもハゲの しか えません.ハローワールド! martini.Classic()
が び した 、マーティンはデフォルトでいくつかのツールを します. なのはルートです.その 、m.Get("/", func()string{return "Hello, world!"}
を してどの がどの にマッピングされるかを してもいいです. にm.Run()
を び して3000ポートで のアプリを します.
からこのアプリを に します.まず な が です. たちは をするべきですか? に べたように、ユーザーはこのAPIでfeedbackを して、 のインターフェースでこれらの をリスト で します. はこんなに です. のステップでこれらの を します.
Controller
insert 1つのfeedbackのために な はまだ きいです. なfeedbackデータをPOSTで ります.ですから、POSTのパスと Handlerが です.
m
.
Post
(
"/"
,
func
(
req
*
http
.
Request
)
string
{
// req ,
}
)
feedback GET 。 GET Handler。 :
m
.
Get
(
"/"
,
func
(
)
string
{
// Json
return
[
]
map
[
string
]
string
{
map
[
string
]
string
{
"feedbackcode"
:
"1"
,
"username"
:
"John"
}
,
map
[
string
]
string
{
"feedbackcode"
:
"2"
,
"username"
:
"Tony"
}
}
}
Handler API 。 Controller。
Controller
, :
package
controllers
import
(
// "fmt"
"fmt"
"github.com/martini-contrib/render"
"navigator/conf"
"navigator/models"
"net/http"
)
type
FeedbackController
struct
{
}
func
(
c
*
FeedbackController
)
FeedbackList
(
req
*
http
.
Request
,
r
render
.
Render
)
{
f
:=
new
(
models
.
FeedbackModel
)
r
.
JSON
(
200
,
map
[
string
]
interface
{
}
{
"data"
:
f
.
ModelList
(
nil
)
}
)
}
github.com/martini-contrib/render
、 レンダーはレンダリングされたカバンです.htmlの があれば、データをhtmlテンプレートで できるデータに できます.ここではこのカバンを って をjsonデータに します. r.JSON(200, map[string]interface{}{"data": f.ModelList(nil)})
の で200は コードです. が な はstringがkeyで、Modelリストが の です.
ここでは に のfeedbackのModel を ることができます.
type
DeviceInfo
struct
{
SystemType
string
`
json
:
"systemType"
`
// ios or android
SystemVer
string
`
json
:
"systemVersion"
`
// system version eg, ios 9.1
AppVer
string
`
json
:
"appVersion"
`
// app version eg, 2.9.0
}
type
FeedbackModel
struct
{
FeedbackCode
string
`
json
:
"feedbackCode"
`
UserName
string
`
json
:
"userName"
`
PhoneNum
string
`
json
:
"phoneNum"
`
DeviceInfo
DeviceInfo
`
json
:
"deviceInfo"
`
ImageList
[
]
string
`
json
:
"imageList"
`
Desc
string
`
json
:
"description"
`
FeedbackType
string
`
json
:
"feedbackType"
`
// normal feedback or a problem in use
Other
string
`
json
:
"other"
`
// other infomation
}
json , Golang Model 。 "``" , Model json Model json key 。 Controller , Controller Get Post Handler 。 :
package
main
import
(
// other packages
"navigator/controllers"
)
func
main
(
)
{
var
m
=
martini
.
Classic
(
)
var
r
=
martini
.
NewRouter
(
)
feedbackController
:=
new
(
controllers
.
FeedbackController
)
r
.
Get
(
"/nav/feedback"
,
feedbackController
.
FeedbackList
)
r
.
Post
(
"/nav/feedback"
,
feedbackController
.
Feedback
)
m
.
Action
(
r
.
Handle
)
m
.
RunOnAddr
(
":9090"
)
}
r.Get("/nav/feedback", feedbackController.FeedbackList)
は、 のアクセス を しました./nav/feedbackは、パスにプロジェクトの を けて したものです. feedbackというのは、 の インターフェースと する があります.つまりインターフェースの です.この を けるためにプロジェクト を けました.feedbackController := new(controllers.FeedbackController)
はFeedbackControllerを しました.feedbackController
は、Feedback Controllerを しました.244579142の です.FeedbackList
は、アクセスの と される. GETのHttpアクセスとFeedbackList
は されています.POSTのHttpアクセスとFeedback
はバインディングされています. にm.RunOnAddr(":9090")
は に したm.Run()
の わりになりました. はappは3000ポートで していました. はm.RunOnAddr(":9090")
を じて9090ポートで されます.つまり、このフレーズでappの ポートを することができます.
ModelsとMongoDB
MongoDBを っています. たちはmgoというライブラリを っています.Golangはもう になりました.これだけ くのスター が ています.しかし、MongoDBを う したライブラリはまだないと ってもいいです.pythonやnodejsなどの のライブラリがそんなに だとは いません. なものがあります. のギthub の がたくさんあります.Golangでもあります.Golangでもあります.Golangの にはgomgoライブラリということです. できます
POSTが したfeedbackのjson が られてきたら、FeedbackModel
のオブジェクトに されます.Golangのjsonライブラリはこのようにしてくれます. json.Unmarshal([]byte(dict), &f)
ここのUnmarshal
では、 つのjson をFeedbackModelオブジェクトに します.ここでは、 つの を します. つのModelオブジェクトを し、このオブジェクトは つの Modelオブジェクトであるべきです. のこのModelオブジェクトは、オペレーティングデータベース、 、 、 、 が な を えています.
func
NewFeedbackModel
(
dict
string
)
*
FeedbackModel
{
var
f
FeedbackModel
err
:=
json
.
Unmarshal
(
[
]
byte
(
dict
)
,
&
f
)
if
err
!=
nil
{
return
nil
}
return
&
f
}
"encoding/json"
.feedbackのjson を け ると、この でFeedbackModelオブジェクトに します. で べたように、このModelにデータベース を する があります.json で られたModelでデータの ができます.コード:
func
(
m
*
FeedbackModel
)
ModelList
(
conditions
map
[
string
]
string
)
[
]
FeedbackModel
{
confInstance
:=
conf
.
ConfigInstance
(
)
mgoUri
:=
conf
.
ConfigInstance
(
)
.
MongoDBConnectionString
(
)
// var f FeedbackModel
session
,
err
:=
mgo
.
Dial
(
mgoUri
)
if
err
!=
nil
{
fmt
.
Printf
(
"can not connect to server %v
"
,
err
)
panic
(
err
)
}
defer
session
.
Close
(
)
var
feedbackModelList
[
]
FeedbackModel
collection
:=
session
.
DB
(
confInstance
.
DBName
)
.
C
(
"feedback"
)
err
=
collection
.
Find
(
conditions
)
.
All
(
&
feedbackModelList
)
return
feedbackModelList
}
func
(
m
*
FeedbackModel
)
GetModel
(
modelId
string
)
(
*
FeedbackModel
,
error
)
{
//
collection
:=
session
.
DB
(
confInstance
.
DBName
)
.
C
(
"feedback"
)
err
=
collection
.
Find
(
bson
.
M
{
"feedbackcode"
:
modelId
}
)
.
One
(
&
f
)
return
&
f
,
nil
}
func
(
m
*
FeedbackModel
)
InsertModel
(
model
*
FeedbackModel
)
error
{
//
f
:=
session
.
DB
(
confInstance
.
DBName
)
.
C
(
"feedback"
)
err
=
f
.
Insert
(
model
)
return
err
}
.
ここまで れば、 のfeedbackを から までの を げることができます.
します
のアプリの り にあります. されたパスと なController が されています. が たら、パスとバインディングのパスが しています.Controllerに られるバインディングされた の で されます.
このhttp を するController はhttp を したjson をModelモジュールに します.Modelモジュールはjson をModelインスタンスに します.このModelは なModelです.その を び してModel のデータをMongoデータベースに します.もちろん、データベースからこれらのデータを べられます.
ここに てください
ここに て、MartiniというGolangフレームで なサイトを する に れました.はい、 はRESTアプリです. の で べたRenderフレームを って、Modelデータを してから、htmlのtemplateに することができます.MongoDBデータベースにも れています.とても なデータベースです.RESTアプリを しますか?それともhtmlサイトを しますか? なものはすべてMongoDBデータベースの に できます.ここに けば、 の の を に けられます.
MongoDB 。 MongoDB , , , Collection。 。 , 。 , Document。 Document 2M。
MongoDB :
db
.
feedback
.
find
(
{
"feedbackCode"
:
"1"
}
)
// {"feedbackCode":"1"}) //
find , 。 :
db
.
feedback
.
insert
(
{
"feedbackCode"
:
"2"
}
)
Golang mgo MongoDB , Go 。
collection
:=
session
.
DB
(
confInstance
.
DBName
)
.
C
(
"feedback"
)
Collection。 、 、 Collection 。 , :
collection
.
Find
(
conditions
)
.
All
(
&
feedbackModelList
)
feedback Model 。 :
collection
.
Find
(
bson
.
M
{
"feedbackcode"
:
modelId
}
)
.
One
(
&
f
)
:
collection
.
Insert
(
model
)
insert , model , :var model *FeedbackModel