因为学习了Golang,我创建了一个简单的REST API并将其部署到Heroku上
首先
我很荣幸能够参加创作者实验室的在线学习会。
我开始学习Golang了!
因为我对编写Golang的乐趣产生了兴趣,所以我将总结一下在Golang中创建简单的API并将其快速部署到Heroku上的步骤。
Golang 是什么?
公式文件请点击这里。
Golang是由Google开发的语言云云。。
由于这一点已经有很多解释了,所以在本文中将不进行详述。
我觉得这种语言非常轻松和容易上手。
用Golang可以做什么
-
- WEBアプリケーション開発
-
- モバイルアプリケーション開発
- IoT分野での組み込み系システム開発
听说它还有各种不同的用法。
真的什么都能做得到。。
Golang的优点和缺点
好处
-
- 処理が高速
-
- コンパイルも早い
-
- シンプルな記述ができる
- ある程度制約があるため、チーム開発でも用いやすい
缺点
-
- ジェネリックや継承など、言語仕様的に物足りない部分もある
- Golangエンジニアの数が少ない
尝试使用Golang搭建服务器。
一个可以用来搭建轻量级WEB服务器的库是echo (https://echo.labstack.com/guide)。
如果使用上述的 echo 库,可以立刻轻松创建一个简单的 REST API。
如果您使用go get命令获取了Echo库,只需要像下面这样写就可以启动一个服务器。
import (
"net/http"
"os"
"github.com/labstack/echo"
)
func main() {
// サーバーのインスタンス作成
e := echo.New()
// ルーティング設定
e.GET("/", helloworld)
// サーバー起動
e.Logger.Fatal(e.Start(":" + os.Getenv("PORT")))
}
func helloworld(c echo.Context) error {
return c.String(HttpStatus.OK, "Hello, World")
}
启动命令大致如下。
go run main.go
如果使用此命令启动服务器,在根目录发送GET请求会创建一个能够返回字符串(JSON)”Hello, World”的API!
使用Golang进行数据库操作
可以用于数据库操作的库
– GORM (https://gorm.io/ja_JP/docs/index.html)
接下来,我们要添加将值保存到数据库并获取并显示的处理。
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/labstack/echo"
)
type Content struct {
gorm.Model
Text string `json:"text"`
}
// DBのインスタンスをグローバル変数に格納
var (
db *gorm.DB
)
func main() {
// DB接続処理
var err error
db, err = gorm.Open("sqlite3", "/tmp/gorm.db")
if err != nil {
panic("failed to connect database")
}
// サーバーが終了したらDB接続も終了する
defer db.Close()
// スキーマのマイグレーション
db.AutoMigrate(&Content{})
// レコード登録
db.Create(&Content{Content: "Hello, World"})
// レコード全取得
db.Find(&Content)
}
因为GORM是ORM,所以可以进行数据库操作,无需编写SQL语句。
如果使用GORM,像我这样的SQL初学者也能轻松地进行数据库操作,太厉害了。
将此代码与上述代码组合在一起的代码如下。
import (
"net/http"
"os"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/labstack/echo"
)
type Content struct {
gorm.Model
Text string `json:"text"`
}
// DBのインスタンスをグローバル変数に格納
var (
db *gorm.DB
)
func main() {
// DB接続処理
var err error
db, err = gorm.Open("sqlite3", "/tmp/gorm.db")
if err != nil {
panic("failed to connect database")
}
// サーバーが終了したらDB接続も終了する
defer db.Close()
// サーバーのインスタンス作成
e := echo.New()
// ルーティング設定
e.GET("/contents", getAllContents)
e.POST("/create", createContent)
// サーバー起動
e.Logger.Fatal(e.Start(":" + os.Getenv("PORT")))
}
func createContent(c echo.Content) error {
// レコード登録
db.Create(&Content{Text: "newText"})
return c.String(http.StatusOK, "record created")
}
func getALlContent(c echo.Content) error {
var content Content
// contentテーブルのレコードを全件取得
db.find(&content)
// 取得したデータをJSONにして返却
return c.JSON(http.StatusOK, content)
}
【准备工作】将用Golang制作的API部署到Heroku。
为了构建Heroku上的Go API所需的材料:
– go.mod → 版本控制
– Procfile → Heroku特有的配置文件
– GitHub仓库 → 在Heroku部署时需要
要在Heroku上运行Go编写的API,需要创建一些在本地不需要的文件。
让我们按顺序一一查看。
有关go.mod
首先,引入一个被称为go.mod的Go版本管理库。
如果没有这个,当部署到Heroku时,会导致构建失败。
只要创建一个go.mod文件,就可以定义库的版本。这样一来,就可以在Heroku服务器上构建。
这篇文章详细介绍了如何使用 go.mod。
总的来说,在项目的根目录下,只需执行以下命令。
go mod init
现在go.mod的准备工作已经完成了!
关于Procfile的内容
有关Procfile,有官方文档可供参考。
大致上说,这是在Heroku上运行应用程序所需的文件。
由于我没有调查具体的写作方法,所以请参阅文档以了解详细信息。
本次只需在根目录下创建一个Procfile文件,并指定编译后文件的路径。
web: bin/first_go_api(作成したgitリポジトリ名)
关于GitHub存储库
我不会提供关于GitHub的详细解释。
因为Heroku会参考GitHub的存储库进行部署,所以这似乎是在讨论创建存储库的事情!
正如前面所述,我们需要在Procfile中指定库的名称,因此,请给它取一个容易理解的名字。
将使用Golang编写的API部署到Heroku。
现在开始实际部署。
由于这篇文章不是关于Heroku的,所以请尝试在Google上搜索详细的步骤。
暂且这是Heroku官方文档的网址。
我觉得通过Heroku CLI进行部署应该很简单。
似乎即使在使用Docker进行环境设置时,也可以轻松进行部署。
完成部署后,通过curl命令来进行确认!
如下为POST方法(记录注册)的相关信息↓
curl -X POST -H "Content-Type: application/json" -d '{"Text":"newText"}' https://<アプリのURL>/create
以下是回复的内容。
"record created"
接下来是GET方法(获取记录)↓
curl 'https://<アプリのURL>/contents'
以下是回应的内容。
{
"Value": {
"ID": 1,
"CreatedAt": "2020-04-19T00:05:09.494982+09:00",
"UpdatedAt": "2020-04-19T00:05:09.494982+09:00",
"DeletedAt": null,
"Text": "newText",
},
"Error": null,
"RowsAffected": 1
}
您真的很擅长这个。
最后
在工作中主要使用Java,但是我对Go的编写和理解的简单性感到非常惊讶。
有趣的产品通常使用Node.js作为后端开发,但是我希望将Go语言也考虑在内,以便在技术选择上更加多样化。
此外,截至2020年4月19日至2020年5月31日,Mercari的Go学习材料将进行限时免费公开。
如果你感兴趣的话,一定要去看一看!
Go编程语言的全面入门