Android 트렐로 API 연동하는 방법 - Trello REST API

트렐로 API로 리스트, 카드 만들기

트렐로는 프로젝트를 보드로 정리하는 협업 툴입니다. 프로젝트 뿐만 아니라 개인의 학습을 정리하기에도 유용하고 To-DO List로 많이 활용되고 있습니다. UI도 상당히 직관적이라 사용법을 익히지 않아도 누구든지 쉽게 활용이 가능합니다. 웹, 앱이 존재하지만 API를 활용하여 효과적으로 활용할 수도 있습니다.

1단계 트렐로 회원가입 및 보드 생성하기

2단계 트렐로 API Key & Token 생성하기

3단계 안드로이드 코드 작성을 위한 세팅

<uses-permission android:name="android.permission.INTERNET"/>
apply plugin: 'com.android.application'

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
    //생략
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
    implementation 'com.mashape.unirest:unirest-java:1.3.27'
}

4단계 간단한 레이아웃 만들기

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="144dp"
        android:text="Trello Test"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_board_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="29dp"
        android:text="Get Board ID"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/btn_make_card"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Make Card"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_make_list" />

    <Button
        android:id="@+id/btn_make_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Get List ID"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_board_id" />

</androidx.constraintlayout.widget.ConstraintLayout>

5단계 코틀린 코드 작성

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.mashape.unirest.http.HttpResponse
import com.mashape.unirest.http.JsonNode
import com.mashape.unirest.http.Unirest
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    var id = "1단계에서 메모한 ID"
    var boardID = ""
    var listID = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val key = "2단계에서 메모한 KEY값"
        val token = "2단계에서 메모한 토큰값"

        val btnBoardID = findViewById<Button>(R.id.btn_board_id)
        val btnMakeList = findViewById<Button>(R.id.btn_make_list)
        val btnMakeCard = findViewById<Button>(R.id.btn_make_card)

        btnBoardID.setOnClickListener {
            GlobalScope.launch(Dispatchers.IO) {
                getBoardID(id, key, token)
            }
        }

        btnMakeList.setOnClickListener {
            if (boardID?.length > 0) {
                GlobalScope.launch(Dispatchers.IO) {
                    makeList("List Make Test", key, token)
                }
            }
        }

        btnMakeCard.setOnClickListener {
            if (boardID?.length > 0 && listID?.length > 0) {
                GlobalScope.launch(Dispatchers.IO) {
                    makeCard("Card Test", key, token)
                }
            }
        }

    }

    private fun getBoardID(id: String, key: String, token: String) {
        //https://trello.com/b/kIG7bBk4/kotlin-upload 트렐러 보드를 생성하면 b/뒤에 있는 부분이 ID값
        val response: HttpResponse<JsonNode> =
                Unirest.get("https://api.trello.com/1/boards/${id}")
                        .header("Accept", "application/json")
                        .queryString("key", key)
                        .queryString(
                                "token",
                                token
                        )
                        .asJson()
        Log.e("Trello", response.body.toString())
        boardID = response?.body?.`object`?.getString("id") ?: ""
    }

    private fun makeList(name: String, key: String, token: String) {
        val response = Unirest.post("https://api.trello.com/1/boards/${boardID}/lists")
                .queryString("key", key)
                .queryString("token", token)
                .queryString("name", name)
                .asJson() //asString() 기존

        listID = response?.body?.`object`?.getString("id") ?: ""
        Log.e("Trello", response.body.toString())
    }

    private fun makeCard(text: String, key: String, token: String) {
        val response = Unirest.post("https://api.trello.com/1/cards")
                .queryString("key", key)
                .queryString(
                        "token",
                        token
                )
                .queryString("idList", listID)
                .queryString("name", text)
                .asString()

        Log.e("Trello", response.body.toString())
    }
}

6단계 실행

결론



Related Posts