Mengenal Javascript Map dan Set

Kali ini saya akan membahas sedikit mengenai objek yang sepertinya jarang diketahui dan dipakai oleh orang-orang pada Javascript, namanya Map dan Set.

Map mirip seperti Object biasa, berfungsi untuk menyimpan collection dengan key, bedanya, key pada map ini bisa berupa tipe data yang lebih beragam, seperti primitif (angka, string, boolean), object, atau bahkan NaN.

let map = new Map();

map.set("1", "str1");
map.set(1, "num1");
map.set(true, "bool1");

let obj = {name: "Akhdani"};

map.set(obj, "obj1");
map.set(NaN, "nan1");

console.log( map.get(1)   ); // 'num1'
console.log( map.get('1') ); // 'str1'
console.log( map.get(true)); // 'bool1'
console.log( map.get(obj) ); // 'obj1'
console.log( map.get(NaN) ); // 'nan1'


console.log( map.size ); // 5

console.log( map ); // Map(5) {"1" => "str1", 1 => "num1", true => "bool1", {…} => "obj1", NaN => "nan1"}

Bisa kita lihat, Map bisa menerima apa saja sebagai keynya. Cukup ajaib menurut saya. :D

Fitur tambahannya adalah:

  • Urutan dipertahankan sesuai urutan melakukan entry.
  • Tipe data tidak diubah, sehingga key berupa string “1” dan key integer 1 tetap ada keduanya.

Bagaimana jika ingin iterasi entry Map? Ada tiga cara:

  • map.keys() untuk iterasi key
  • map.values() untuk iterasi value
  • map.entries() untuk iterasi entry, berupa key dan valuenya
for (let k of map.keys()) {
  console.log(k);
}

for (let v of map.values()) {
  console.log(v);
}

for (let entry of map) {
  console.log(entry); 
}

 

Set bisa dibilang mirip array, hanya saja tidak bisa duplikat elemen.

let set = new Set();

let akhdani = { name: "Akhdani" };
let reka = { name: "Reka" };
let solusi = { name: "Solusi" };

set.add(akhdani);
set.add(reka);
set.add(solusi);
set.add(reka);
set.add(solusi);

console.log( set.size ); // 3

for (let user of set) {
  console.log(user.name);
}

Bisa kita lihat di atas meskipun “reka” dan “solusi” di-add dua kali, set tetap hanya berisi 3 elemen. Urutan tentu saja dipertahankan karena lebih mirip seperti array.

Javalite RESTful Controller

Sama seperti framework lain yang berbasis mvc, controller merupakan sebuah class yang berperan penting untuk menerima dan mengembalikan request yang dilakukan oleh user. Pada javalite, controller terdapat pada framework activeweb, dan berperan juga sebagai route aplikasi yang akan kita buat.

Untuk membuat sebuah class sebagai controller pada javalite, caranya hanya dengan meng-extends class org.javalite.activeweb.AppController dan menyimpan class tersebut pada directory app.controllers seperti berikut :

package app.controllers;
import org.javalite.activeweb.AppController;

public class HomeController extends AppController {
   @GET
   public void index(){
      render().noLayout();
      respond("Hello world, selamat datang di home controller");
   }
}

Karena controller pada javalite berfungsi sebagai routing aplikasi, semua controller javalite dapat diakses dengan pola url

http://HOST:PORT/CONTEXT/CONTROLLER_NAME/{ACTION}/{ID}

Dengan pola tersebut, maka HomeController diatas dapat diakses sebagai url seperti berikut:

http://localhost:8080/home/index

HOST = localhost
PORT = 8080
CONTEXT = / (misal class HomeController berada di folder ‘master’, maka context = ‘/master’)
CONTROLLER_NAME = home
ACTION = index (action dengan nama ‘index’ bisa tidak dituliskan)

Pada controller diatas terdapat sebuah anotasi yang disimpan diatas sebuah aksi, anotasi tersebut menandakan HTTP Method yang digunakan pada aksi tersebut. Pada contoh diatas aksi index dapat diakses dengan method GET. Selain @GET method lain dapat di tulis dengan anotasi @POST, @DELETE, @PUT, @HEAD.

Lalu, bagaimana dengan RESTful controller?

Untuk membuat sebuah class menjadi RESTful controller pada javalite, caranya sama dengan membuat controller biasa seperti diatas, namun dengan tambahan sebuah anotasi @RESTful. Dengan menambah anotasi tersebut maka controller tersebut akan dikenal sebagai sebuah RESTful controller oleh javalite, dan dengan menambahkan anotasi tersebut juga, maka class tersebut harus harus memiliki satu set methods yang sudah ditentukan. Berikut contoh class RESTful controller:

package app.controllers;

import org.javalite.activeweb.AppController;
import org.javalite.activeweb.annotations.RESTful;

@RESTful
public class BookController extends AppController {
   public void index() { }
   public void newForm() { }
   public void create() { }
   public void show() { }
   public void editForm() { }
   public void update() { }
   public void destroy() { }
}

Pada RESTful controller, kita tidak perlu menuliskan Http method apa yang digunakan pada aksi yang ada dicontroller tersebut. Lalu, untuk mengakses RESTful controller diatas sebagai url dapat dijelaskan pada tabel berikut

HTTP Method Path Action
GET /book Index
GET /book/new_form
/book/new-form
newForm
POST /book create
GET /book/id show
GET /book/id/edit-form
/book/id/edit_form
editForm
PUT /book/id update
DELETE /book/id destroy

Diatas merupakan penjelasan singkat bagaimana membuat sebuah RESTful controller dan bagaimana mengakses RESTful controller di javalite. Selamat mencoba.

Javalite Http Client

Javalite HTTP merupakan sebuah library dari javalite untuk membuat sebuah request http ke client. Sebenarnya untuk http client sendiri kita dapat menggunakan HttpClient milik apache yang lebih sering digunakan, tetapi library Http dari javalite ini dapat menjadi pilihan lain untuk melakukan request http ke client. Mari kita lihat apa saja yang dapat kita lakukan dengan library ini.

Untuk memulai menggunakan javalite http, kita dapat menambahkan dependency javalite-common kedalam build tools yang kita gunakan

Maven

<dependency>
   <groupId>org.javalite</groupId>
   <artifactId>javalite-common</artifactId>
   <version>2.0</version>
</dependency>

Gradle

compile group: 'org.javalite', name: 'javalite-common', version: '2.0'

GET

Untuk membuat request get ke client menggunakan library Http, kita dapat membuatnya seperti berikut:

Get get = Http.get(“http://example.com”);
System.out.println(get.text());
System.out.println(get.headers());
System.out.println(get.responseCode());

Penjelasan untuk baris kode diatas yaitu kita melakukan request menggunakan method GET ke client http://example.com dan menampilkan pada console berupa response body, response headers, dan response code. Class Get diatas merupakan sebuah class yang menampung response dari client dengan request method get. Sedangkan untuk mengolah response dari client kita dapat menggunakan fungsi – fungsi berikut

  1. Method.text() : untuk mendapatkan responseBody
  2. Method.headers() : untuk mendapatkan responseHeaders
  3. Method.responseCode() : untuk mendapatkan responseCode

POST

Untuk melakukan request POST ke client, dapat menggunakan banyak cara, misalkan kita akan melakukan request POST ke client dengan data berupa JSON, maka kita dapat membuatnya seperti berikut :

Post post = Http.post(“http://example.com/post-json”, json)
                .header(“Accept”, “application/json”)
                .header(“Content-Type”, “application/json”);

Atau, jika kita bekerja dengan form, maka kita tidak perlu repot untuk mengubah data dari form input ke JSON, kita dapat mengirimkan langsung input dari form menggunakan param.

Post post = Http.post(“http://example.com/post”)
                .param(“firstname”, “john”)
                .param(“lastname”, “doe”);

Sama seperti request GET, pada request POST kita menampung response dari client pada class Post, dan untuk mengolah response dari client kita dapat memanggil fungsi post.text(), post.header() atau post.responseCode()

MULTIPART REQUEST

Pada kasus tertentu, kita ingin mengirimkan sebuah file ke client, maka kita dapat menggunakan multipart request menggunakan javalite http, berikut contoh penggunaan multipart request:

Multipart mp = Http.multipart(“http://example.com/post-multipart”)
                   .field(“filename”, “doc1”)
                   .file(“file”, “/home/example/doc1.txt”);

Diatas merupakan beberapa contoh simple dalam melakukan request menggunakan library Http milik javalite, tentunya penggunaan library ini dapat diexplore lebih jauh lagi sesuai kebutuhan. Selamat mencoba.