因为学习了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编程语言的全面入门

bannerAds