最後來講一下Response的部分
在controller/notion.go這個controller中,最後需要處理回傳回來的response
首先先到Notion的文件中尋找Create Notion Database的頁面
Start building with the Notion API
這邊可以先看一下他給的200 ok response會是什麼內容
{
"object": "database",
"id": "bc1211ca-e3f1-4939-ae34-5260b16f627c",
"created_time": "2021-07-08T23:50:00.000Z",
"last_edited_time": "2021-07-08T23:50:00.000Z",
"icon": {
"type": "emoji",
"emoji": "🎉"
},
"cover": {
"type": "external",
"external": {
"url": "https://website.domain/images/image.png"
}
},
"url": "https://www.notion.so/bc1211cae3f14939ae34260b16f627c",
"title": [
...
],
"properties": {
...
},
"parent": {
"type": "page_id",
"page_id": "98ad959b-2b6a-4774-80ee-00246fb0ea9b"
},
"archived": false
}
properties跟title的部分太長我就先不show出來,接著需要把這個response轉成golang的struct
怎麼轉呢? 當然是借助我們的好幫手
chatGPT來幫忙轉😂
直接講這串json貼給chatGPT,請他幫忙轉成golang的struct
轉出來的struct長這樣
model/notion.go
type NotionCreateDatabaseResponse struct {
Object string `json:"object"`
ID string `json:"id"`
CreatedTime string `json:"created_time"`
LastEditedTime string `json:"last_edited_time"`
Icon struct {
Type string `json:"type"`
Emoji string `json:"emoji"`
} `json:"icon"`
Cover struct {
Type string `json:"type"`
External struct {
URL string `json:"url"`
} `json:"external"`
} `json:"cover"`
URL string `json:"url"`
Title []struct {
Type string `json:"type"`
Text struct {
Content string `json:"content"`
Link interface{} `json:"link"`
} `json:"text"`
Annotations struct {
Bold bool `json:"bold"`
Italic bool `json:"italic"`
Strikethrough bool `json:"strikethrough"`
Underline bool `json:"underline"`
Code bool `json:"code"`
Color string `json:"color"`
} `json:"annotations"`
PlainText string `json:"plain_text"`
Href interface{} `json:"href"`
} `json:"title"`
Properties struct {
PlusOne struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
People struct{} `json:"people"`
} `json:"+1"`
InStock struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Checkbox struct{} `json:"checkbox"`
} `json:"In stock"`
Price struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Number struct {
Format string `json:"format"`
} `json:"number"`
} `json:"Price"`
Description struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
RichText struct{} `json:"rich_text"`
} `json:"Description"`
LastOrdered struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Date struct{} `json:"date"`
} `json:"Last ordered"`
StoreAvailability struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
MultiSelect struct {
Options []struct {
ID string `json:"id"`
Name string `json:"name"`
Color string `json:"color"`
} `json:"options"`
} `json:"multi_select"`
} `json:"Store availability"`
Photo struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Files struct{} `json:"files"`
} `json:"Photo"`
FoodGroup struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Select struct {
Options []struct {
ID string `json:"id"`
Name string `json:"name"`
Color string `json:"color"`
} `json:"options"`
} `json:"select"`
} `json:"Food group"`
Name struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Title struct{} `json:"title"`
} `json:"Name"`
} `json:"properties"`
Parent struct {
Type string `json:"type"`
PageID string `json:"page_id"`
} `json:"parent"`
Archived bool `json:"archived"`
IsInline bool `json:"is_inline"`
}
這個struct放在model裡面,這樣就可以讀取這個response了
再來要來修改controller/notion.go這個檔案
把response跟這個model接起來
// CreateNotionDatabase godoc
//
// @Summary Create a new Notion Database
// @Description Creates a database as a subpage in the specified parent page, with the specified properties schema. Currently, the parent of a new database must be a Notion page or a wiki database.
// @Tags notion
// @Accept json
// @Produce json
// @Success 200 {array} model.NotionCreateDatabaseResponse
// @Failure 400 {string} string "fail"
// @Router /api/v1/notion/createDatabase [post]
func (c *Controller) CreateNotionDatabase(ctx *gin.Context) {
...
response, err := client.Post("https://api.notion.com/v1/databases", header, body)
if err != nil {
log.Fatalln(err)
}
defer response.Body.Close()
// Change the response body to []byte type
responseBody, err := io.ReadAll(response.Body)
if err != nil {
log.Fatalln(err)
}
bodyStr := string(responseBody)
var data []byte = []byte(bodyStr)
// Unmarshal the response body to struct
var responseCreateNotionDatabase model.NotionCreateDatabaseResponse
json.Unmarshal(data, &responseCreateNotionDatabase)
ctx.JSON(http.StatusOK, responseCreateNotionDatabase)
}
上面取得response後,可以用io.ReadAll
來讀取response.body
把responseBody轉成string後,再轉成[]byte
的形式
最後用json.Unmarshal
把data的資料寫進model.NotionCreateDatabaseResponse
中
再讓gin.Context
來接這個model就可以了
這邊要注要記得把上面註解中的success改成
// @Success 200 {array} model.NotionCreateDatabaseResponse
並且執行update-swagger.sh,才會更新swagger的內容喔~
這樣新手教學就結束了,再來會開始來研究Google API