Konsep Rest API dan Pemisahkan Dashboard dengan Rest API

By | October 25, 2026
58 Views

Pembuatan dashboard saat ini sudah sangat dipermudah oleh AI seperti menggunakan excel, tableau, powerBI atau kalian suka coding bisa mengguanakan shiny (berbasis R ataupun Python).

Kebanyakan tutorial Rshiny banyak menggunakan logic yang langsung dihandle disatu kode App.R padahal kalau sering diakses oleh banyak user sekaligus tentu sangat memberatkan jikalau olah datanya didalam kode App.R itu sendiri.

Bilamana datanya sangat kecil dan didalamnya hanya isinya 1 tabel saja akan sangat berbeda sekali kalau ada ratusan ribu record dan join tabelnya sangat banyak (case nya kalian tidak bisa masuk kedalam sql sehingga hanya disediakan excel/csv saja atau bahkan dikasih data mentah nya) sehingga harus melakukan pre pengolahan dan join tabel di R sekaligus.

Untuk menyiasati hal demikian, saya menggunakan konsep rest api sebagai penyedia data nya sedangkan rshiny hanya bertugas melakukan visualisasi. Konsep ini seperti MVP yaitu model view controller.

Bagian logika pengolahan data akan diolah oleh rest api. Disini kalian banyak mengolah logika data, bilamana nanti perlu update harian bisa dilakukan secara manual menggunakan token atau mekanisme lainnya.

Sedangkan untuk view menggunakan Rshiny yang memanggil URL dengan return JSON/Data frame.

Dataset

berikut dataset yang digunakan terdiri dari 1 file xlsx yang disimpan dalam folder

data api

New wpDataTable

Generated by wpDataTables

Membuat Rest API

Library Rest API menggunakan plumber, simpan nama service.R

library(plumber)
library(dplyr)
library(readxl)



data = readxl::read_xlsx("data api.xlsx")


#* Memeriksa kesiapan API
#* @get /health
function() {
  list(
    status = "OK",
    service = "Data Material Operation",
    ready = TRUE
  )
}





#* @get /data_produk
function(){
  data %>%
    group_by(`Nama Produk`) %>%
    summarise(
      `Kuantum` = sum(`Kuantum`,na.rm = TRUE),.groups="drop"
    )
  
}

Run Server API

Kemudian kita membuat script buat run API tersebut diatas, simpan dengan nama run_api_demo.R

library(plumber)

api <- plumber::pr("service.R")

api$run(
  host = "127.0.0.1",
  port = 8000
)
Run saja dengan perintah source(“run_api_demo.R”)

maka akan tampil message di console

> source("run_api_demo.R")
Running plumber API at http://127.0.0.1:8000                                  
Running swagger Docs at http://127.0.0.1:8000/__docs__/
Error reporting has been turned off by default. See `pr_set_debug()` for more details.
To disable this message, set a debug value.
This message is displayed once per session.

Mari kita panggil via curl, apakah sudah berjalan dengan baik

curl -X 'GET' \
'http://127.0.0.1:8000/data_produk' \
-H 'accept: */*'

Hasilnya

[
  {
    "Nama Produk": "BEKATUL POLOS CURAH PSO DN",
    "Kuantum": 49570
  },
  {
    "Nama Produk": "BERAS MEDIUM HASIL GILING 25% POLOS 50 KG PSO DN",
    "Kuantum": 227100
  },
  {
    "Nama Produk": "MENIR POLOS CURAH PSO DN",
    "Kuantum": 4270
  }
]

Atau kalau mau yakin, buka saja pakai browser

http://127.0.0.1:8000/__docs__/

Memanggil API

untuk menarik data di R, gunakan kode berikut 

library(httr)
library(jsonlite)

response <- GET("http://127.0.0.1:8000/data_produk")

stopifnot(status_code(response) == 200)

data_produk <- content(
  response,
  as = "text",
  encoding = "UTF-8"
) %>%
  fromJSON()

data_produk

Melalui mekanisme diatas, maka kita sudah memisahkan 2 hal yaitu view / dashboard untuk visualisasi dan logic sebagai pengolah datanya sebagai server tersendiri. Bisa saja suatu saat ada banyak perbaikan logic sebagai perkembangan bisnis maka kita juga bisa menerapkan mekanisme update data.

Membuat Rshiny

Mari kita buatkan rshiny untuk menampilkan hasil res api nya. Sekarang kita buat rshiny untuk menggunakan api diatas

library(shiny)
library(httr)
library(jsonlite)
library(DT)

ui <- fluidPage(
  titlePanel("Data Produk"),

  actionButton("refresh", "Muat Ulang Data"),

  br(),
  br(),

  DTOutput("tabel_produk")
)

server <- function(input, output, session) {

  data_produk <- eventReactive(input$refresh, {

    response <- GET(
      "http://127.0.0.1:8000/data_produk",
      timeout(30)
    )

    stop_for_status(response)

    fromJSON(
      content(response, as = "text", encoding = "UTF-8"),
      simplifyDataFrame = TRUE
    )

  }, ignoreNULL = FALSE)

  output$tabel_produk <- renderDT({
    datatable(
      data_produk(),
      options = list(
        pageLength = 10,
        scrollX = TRUE
      ),
      rownames = FALSE
    )
  })
}

shinyApp(ui, server)

Mekanisme Update

Tentu kode API diatas belum dilengkapi dengan teknik update data, nah kalian bisa baca2 lagi digoogle atau chatgtp mengenai mekanisme update di plumber.