반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 00:03
관리 메뉴

ImJay

[Java Spring] Notion API 페이지 블록 추가 (Append block children) 본문

개인 프로젝트

[Java Spring] Notion API 페이지 블록 추가 (Append block children)

ImJay 2023. 4. 28. 02:52
반응형

Notion API 를 통해 사용자로부터 권한을 받아 글을 작성하는 과정까지 성공했다.

 

 

우리가 만들고자 하는 프로그램의 핵심 기능은 회의록을 실시간으로 작성해준다는 점이었기에,

음성을 텍스트로 변환하고, 이 텍스트가 실시간으로 노션에 작성되는 기능이 필요했다.

만들어진 페이지 내에 내용을 추가하는 기능은 노션 API에서 다행히도 제공하고 있다.

 

포스트맨에서도 확인할 수 있다. Append block children

body > raw 탭에 들어가면 json 을 어떤 형태로 보내야하는지 샘플이 작성되어 있다.

여기서 한참 헤맨 부분이 있는데, heading_2 타입의 첫 속성이 text 로 되어있는데, 이 부분을 rich_text 로 수정해야 한다.

 

어떤 형태로 json을 전송해야 하는지 확인했으니,

이제 스프링 컨트롤러로 patch 하는 부분에 대해 알아보자.

 

우선, 페이지에 블록을 추가하려면 어떤 정보가 있어야되는가?

1. 페이지의 id

-> page id 를 추출하는 방법은 여러방법이 있겠다. 우리는 페이지를 생성함과 동시에 블럭을 실시간으로 추가해야하기 때문에, 페이지 생성부터 블록 추가가 다이렉트로 이루어진다. 따라서 클래스 자체가 인스턴스이기 때문에 아이디를 따로 변수로 저장하기 어려웠고, 따라서 싱글톤 패턴을 활용하여 페이지 아이디를 저장하는 방법을 선택했다.

private void extractedNotionDatabaseId(ResponseEntity<String> responseEntity) {
    // ResponseEntity에서 JSON 추출
    JSONObject json = new JSONObject(responseEntity.getBody());

    // "id"값 추출
    String id = json.getString("id");

    MyDataSingleton.getInstance().setData(id);
}

-> 이렇게 추출된 id는 notion의 append block api 요청 url 에 활용된다.

String id = MyDataSingleton.getInstance().getData();

String url = "https://api.notion.com/v1/blocks/"+id+"/children/";

 

2. notion에 추가할 block 내용을 올바른 형태로 작성한 json

String json = "{\n" +
                "   \"children\": [\n" +
                "      {\n" +
                "         \"object\": \"block\",\n" +
                "         \"type\": \"heading_2\",\n" +
                "         \"heading_2\": {\n" +
                "            \"rich_text\": [{ \"type\": \"text\", \"text\": { \"content\": \"텍스트 수정 내용\" } }]\n" +
                "         }\n" +
                "      },\n" +
                "      {\n" +
                "         \"object\": \"block\",\n" +
                "         \"type\": \"paragraph\",\n" +
                "         \"paragraph\": {\n" +
                "            \"rich_text\": [\n" +
                "               {\n" +
                "                  \"type\": \"text\",\n" +
                "                  \"text\": {\n" +
                "                     \"content\": \"내용\",\n" +
                "                     \"link\": { \"url\": \"https://develop247.tistory.com/\" }\n" +
                "                  }\n" +
                "               }\n" +
                "            ]\n" +
                "         }\n" +
                "      }\n" +
                "   ]\n" +
                "}";

json 을 직접 가져오는 방법도 있겠지만, 편의를 위해 string 으로 작성했다.

json 내에 변수를 넣어 동적으로 작동시키면 된다.

 

3. patch

	// HTTP 요청 헤더를 설정합니다.
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Notion-Version", "2021-08-16");
        headers.set("Authorization", "Bearer " + apiKey);
        System.out.println("apiKey = " + apiKey);


        // HTTP 요청 데이터를 설정합니다.
        HttpEntity<String> requestEntity = new HttpEntity<>(json, headers);

        // Http PATCH method 사용 위해 RequestFactory를 세팅한다.
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

        // HTTP POST 요청을 보냅니다.
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.PATCH, requestEntity, String.class);
        System.out.println("responseEntity = " + responseEntity);

이 부분도 골때렸는데, restTemplate 은 기본적으로 post 밖에 지원을 안한단다.

patch 를 사용하려면 setRequestFactory 세팅이 필요하다.

 

4. 완성 코드

package ParkLab.VMap.controller.notion;

import ParkLab.VMap.controller.meeting.MeetingDataController;
import ParkLab.VMap.model.Service.notion.MyDataSingleton;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class NotionPatchController {
    private final MeetingDataController meetingDataController = new MeetingDataController();
    private final RestTemplate restTemplate = new RestTemplate();

    @GetMapping("/patchNotion")
    public void patchToNotion() throws Exception {
        String apiKey = MyDataSingleton.getInstance().getToken();
        // 요청 URL을 설정합니다.
//        String title = meetingDataController.getMeetingData().getTitle();
        String title = "static data for test";
        String id = MyDataSingleton.getInstance().getData();

        String url = "https://api.notion.com/v1/blocks/"+id+"/children/";

        String json = "{\n" +
                "   \"children\": [\n" +
                "      {\n" +
                "         \"object\": \"block\",\n" +
                "         \"type\": \"heading_2\",\n" +
                "         \"heading_2\": {\n" +
                "            \"rich_text\": [{ \"type\": \"text\", \"text\": { \"content\": \"텍스트 수정 내용\" } }]\n" +
                "         }\n" +
                "      },\n" +
                "      {\n" +
                "         \"object\": \"block\",\n" +
                "         \"type\": \"paragraph\",\n" +
                "         \"paragraph\": {\n" +
                "            \"rich_text\": [\n" +
                "               {\n" +
                "                  \"type\": \"text\",\n" +
                "                  \"text\": {\n" +
                "                     \"content\": \"내용\",\n" +
                "                     \"link\": { \"url\": \"https://develop247.tistory.com/\" }\n" +
                "                  }\n" +
                "               }\n" +
                "            ]\n" +
                "         }\n" +
                "      }\n" +
                "   ]\n" +
                "}";

        // HTTP 요청 헤더를 설정합니다.
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Notion-Version", "2021-08-16");
        headers.set("Authorization", "Bearer " + apiKey);
        System.out.println("apiKey = " + apiKey);


        // HTTP 요청 데이터를 설정합니다.
        HttpEntity<String> requestEntity = new HttpEntity<>(json, headers);

        // Http PATCH method 사용 위해 RequestFactory를 세팅한다.
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

        // HTTP POST 요청을 보냅니다.
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.PATCH, requestEntity, String.class);
        System.out.println("responseEntity = " + responseEntity);

        // HTTP 응답 결과를 확인합니다.
        if (responseEntity.getStatusCode() == HttpStatus.OK) {
            System.out.println("블록 작성 성공!");
        } else {
            System.out.println("블록 작성 실패!");
        }
    }
}

 

모르시는 부분은 댓글 남겨주세요.

반응형
Comments