iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
SideProject30

行事曆不再NG:Notion API&Google Calendar跨平台整合發想系列 第 13

Day 13 Notion First Integration Project in Go vol.4

  • 分享至 

  • xImage
  •  

最後來講一下Response的部分

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的內容喔~

https://ithelp.ithome.com.tw/upload/images/20230928/20140869KZvNSiLTKU.png

這樣新手教學就結束了,再來會開始來研究Google API


上一篇
Day 12 Notion First Integration Project in Go vol.3
下一篇
Day 14 初探 Google Calendar API
系列文
行事曆不再NG:Notion API&Google Calendar跨平台整合發想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言