우선 notion api키와 database id를 알아내는 찾는 방법을 확인하고,
notion database(table)의 payload를 parsing하는 하는 두가지 방식을 비교해 보겠습니다.
1. net/http 패키지만 사용하는 기본적인 방식.
2. go-notion을 이용한 좀 더 편리한 방식.
https://developers.notion.com/로 접속 해주세요. view my integrations 선택
새 api 통합 만들기 클릭
이름을 작성하고 워크스페이스를 선택해주세요.
시크릿 키를 확인 가능합니다.
secret_XXXXXX 형태로 생성 된다.
우선 페이지에 연결 추가를 하세요. 위에서 api key를 생성시에 입력했던 이름이 있습니다.
데이터테이블을 생성한 다음에 보기 링크 복사를 선택하세요.
복사하면 주소가 다음가 같이 보입니다. 여기서 "68ffe73727df4cb2a1940235495ef480"이 database id 입니다.
https://www.notion.so/68ffe73727df4cb2a1940235495ef480?v=XXXXXXXXXXX
아래의 Notion의 표(database)를 코드로 읽어보기
net/http만을 사용하는 방식은 가장 기본적인 방법으로 여타의 api를 사용하더라고 이와 비슷한 방식으로 사용할수 있습니다.
apiKey := "<api_sceret_key>"
databaseId := "<database_id>"
payload := strings.NewReader(`{
<<here for query>>
}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("accept", "application/json")
req.Header.Add("Notion-Version", "2022-06-28")
req.Header.Add("content-type", "application/json")
req.Header.Add("authorization", fmt.Sprint("Bearer ", apiKey))
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
if result["object"] == "error" {
fmt.Printf("Returned Error [%v]: %s\n", result["status"], result["message"])
}
for _, entry := range result["results"].([]interface{}) {
properties := entry.(map[string]interface{})["properties"].(map[string]interface{})
name := parseNotionRichText(properties["name"].(map[string]interface{})["title"].([]interface{}))
tag := properties["tag"].(map[string]interface{})["select"].(map[string]interface{})["name"].(string)
fmt.Printf("(%s), %s\n", name, tag)
}
func parseNotionRichText(richText []interface{}) string {
var text string
for _, entry := range richText {
text += entry.(map[string]interface{})["plain_text"].(string)
}
return text
}
go-notion패키지는 api를 호출하고 structure가 payload에 맞추어 형성되어 있어 parsing하는데 수월 하고 코드를 간결하게 작성 가능 합니다.
apiKey := "<api_sceret_key>"
databaseId := "<database_id>"
client := notion.NewClient(apiKey)
page, err := client.QueryDatabase(context.Background(), databaseId, nil)
if err != nil {
panic(err)
}
for _, entity := range page.Results {
row := entity.Properties.(notion.DatabasePageProperties)
table := Table{name: row["name"], tag: row["tag"]}
fmt.Printf("(%s), %s\n", table.name.Title[0].PlainText, table.tag.Select.Name)
}