Skip to content

Asynchronous Request via Axios

Prologue

Komunikasi antar service dilakukan secara stateless karena dikontrol oleh token JWT yang diterapkan dengan metode bearer token. Sehingga setiap request harus menempelkan authorization header kedalam request agar bisa diproses oleh backend.

Asking Request to Self (1st Party)

Untuk komunikasi api kedalam backend dari service gateway sendiri (Misalkan anda bekerja di GWC dan ingin mengambil data user dari GWC sendiri), hal ini dilakukan dengan menggunakan axios request seperti biasa karena autentikasi dilakukan oleh tools Laravel sendiri secara statefull (Lihat Dokumentasi Laravel) dan hal ini sudah kami setting jadi anda tidak perlu khawatir 😄

Anda bisa menggunakan route name seperti yang laravel gunakan (direkomendasikan 😄) dengan import ziggy-js, atau dengan URL.

javascript
// Menggunakan ziggy-js (Yang kami rekomendasikan)
import { route } from 'ziggy-js';
axios.get(route('nama.route', ['optionalQueryParameter']))
    .then()
    .catch()
    .finally();

// Menggunakan URL
axios.get('/url/tujuan/query1KalauAda')
    .then()
    .catch()
    .finally();

Across Service Request (2nd Party)

Kami telah membuatkan anda class khusus yang memanfaatkan axios instance untuk mengelola request ke service. Class tersebut adalah RequestInstance.js yang bisa anda cari di folder Mixins.

Dalam implementasinya di template, yang anda pakai adalah object yang sudah kami inisiasi dan disimpan dalam Request.js. Setiap object pasti memiliki nama dengan format <projectCode>Request seperti srfRequest, pnrRequest, dan lain sebagainnya. Namun sebelum menggunakan, anda perlu menuliskan dengan URL apa anda melakukan serve untuk project terkait. Silahkan cari di .env baris URL_<projecCode> lalu isi URL anda. Contoh:

dotenv
# Pada awalnya biasanya kosong
URL_SRF= 

# Silahkan isi dengan address serve seperti berikut
URL_PNR="127.0.0.1:10300"

Dengan menggunakan object dari class ini, anda tidak perlu memikirkan soal autentikasi sama sekali karena kami sudah mendesain agar ketika request menerima 401 maka akan class akan mencoba meminta token terlebih dahulu via Axios interceptor.

API Docs

Anda tidak perlu menggunakan semua methods, karena beberapa methods memang didesain untuk penggunaan internal (maaf JS Class tidak menerapkan encapsulation). Berikut adalah methods yang bisa anda pakai:

setBody()

Mengatur request body yang akan dikirim ke server.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
dataObjectRequiredRequest body (payload) yang akan dikirim ke server
asFormDataBooleanfalseDefault data akan dikirim sebagai JSON, namun apabila ini true maka data akan dikirim sebagai Form Data

Return: RequestInstance

setHeader()

Mengatur 1 (satu) item header di dalam request.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
keyStringRequiredNama key dari item header
valueStringRequiredIsi dari item header

Return: RequestInstance

setHeaders()

Mengatur banyak item header di dalam request.

NOTE

Note apabila sudah ada key yang sama di dalam header, maka value akan ditimpa dengan yang baru.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
objHeaderObjectRequiredPasangan key-value yang akan dimasukkan ke dalam header.

Return: RequestInstance

setUrlParam()

Mengatur 1 (satu) url parameter yang akan ditempel pada url.

Contoh: https: //abc.com/{query}/page?param1=hehe&param2=haha. param1 dan param2 adalah URL Parameter, hehe dan haha adalah value dari parameter dimana hehe value dari param1 dan haha value dari param2.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
keyStringRequiredNama key dari item URL Parameter
valueStringRequiredIsi dari item URL Parameter

Return: RequestInstance

setUrlParams()

Mengatur banyak url parameter yang akan ditempel pada url.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
paramsObjObjectRequiredPasangan key-value yang akan dimasukkan ke dalam header.

Return: RequestInstance

get()

Melakukan eksekusi request secara GET dengan semua pengaturan yang telah dibuat.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
routeNameStringRequiredNama route sesuai dengan pengaturan Laravel. (Penjelasan dibawah 😄)
routeParamObjectNULLBagian dari URL path yang bisa berubah sesuai value. Value harus sesuai dengan mapping yang ada di url. (Penjelasan dibawah 😄)

Return: Promise<axios.AxiosResponse<any>>

post()

Melakukan eksekusi request secara POST dengan semua pengaturan yang telah dibuat.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
routeNameStringRequiredNama route sesuai dengan pengaturan Laravel. (Penjelasan dibawah 😄)
routeParamObjectNULLBagian dari URL path yang bisa berubah sesuai value. Value harus sesuai dengan mapping yang ada di url. (Penjelasan dibawah 😄)

Return: Promise<axios.AxiosResponse<any>>

put()

Melakukan eksekusi request secara PUT dengan semua pengaturan yang telah dibuat.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
routeNameStringRequiredNama route sesuai dengan pengaturan Laravel. (Penjelasan dibawah 😄)
routeParamObjectNULLBagian dari URL path yang bisa berubah sesuai value. Value harus sesuai dengan mapping yang ada di url. (Penjelasan dibawah 😄)

Return: Promise<axios.AxiosResponse<any>>

patch()

Melakukan eksekusi request secara PATCH dengan semua pengaturan yang telah dibuat.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
routeNameStringRequiredNama route sesuai dengan pengaturan Laravel. (Penjelasan dibawah 😄)
routeParamObjectNULLBagian dari URL path yang bisa berubah sesuai value. Value harus sesuai dengan mapping yang ada di url. (Penjelasan dibawah 😄)

Return: Promise<axios.AxiosResponse<any>>

delete()

Melakukan eksekusi request secara DELETE dengan semua pengaturan yang telah dibuat.

Parameter:

Nama ParameterTipe DataRequired/DefaultDeskripsi
routeNameStringRequiredNama route sesuai dengan pengaturan Laravel. (Penjelasan dibawah 😄)
routeParamObjectNULLBagian dari URL path yang bisa berubah sesuai value. Value harus sesuai dengan mapping yang ada di url. (Penjelasan dibawah 😄)

Return: Promise<axios.AxiosResponse<any>>

Route Things

Apabila anda di Vue mengenal Route Name kami menerapkan sistem yang sama seperti itu. Namun bedanya, route disini dikelola oleh Laravel dan service gateway menyimpan kamusnya.

url.json

File inilah yang menjadi kamus dari setiap route antar service. Setiap gateway pasti menyimpan file kamus sesuai dengan codename dari service seperti srf.json untuk kamus routing service sertifikasi, pnr.json untuk kamus routing service penerimaan, dst.

Setiap kamus terdiri atas 5 root object sesuai dengan RESTful methods: get, post, put, patch, dan delete. Setiap root object tersusun atas object lagi dengan key yang menjadi routeName dan valuenya adalah URL.

Contoh:

json
{
    "get": {
        "urlPath1": "/hello/world",
        "urlPath2": "/hello/world/{withParam}"
    },
    "post": {
        "path1": "/hello/{withParam}/{withOptionalParam?}"
    }
}

Dari contoh diatas, yang anda tulis di parameter routeName ketika memanggil get(), post(), dll adalah key dari url tersebut. Semisal anda ingin hit /hello/world, note bahwa itu masuk di dalam get, maka anda menggunakan.

javascript
pnrRequest.get('urlPath1');

Ketika bekerja di gateway, tugas anda hanya menerima jadi kamus ini dari yang bekerja di backend setiap service. Namun apabila anda belum mendapatkan update terbaru, silahkan hit endpoint /devjson untuk mendapatkan kamus lengkap dari project tersebut (hanya berlaku di environment local).

TIP

Contoh Penggunaan: Anda belum mendapatkan kamus terbaru untuk service penerimaan. Yang anda lakukan adalah silahkan pull latest update dari service penerimaan, jalankan servicenya dengan command php artisan serve. Lalu hit endpoint http://127.0.0.1:10300/devjson untuk mendapatkan kamus terbaru. Dan paste responsenya ke dalam file pnr.json.

Route Parameter

Dari contoh url.json diatas, perhatikan get.urlPath1 dan post.path1. Di url terdapat string dengan kurung kurawal, itulah yang disebut dengan route parameter.

Route parameter bisa required atau opsional, dan ini ditentukan dengan ada tidaknya tanda tanya (?) di akhir nama route parameter. Dari post.path1 berarti ada 2 route parameter:

  • withParam adalah parameter required, apabila anda tidak memasukkan nilai disini maka kemungkinan besar akan terjadi error 404 ketika melakukan request.
  • withOptionalParam adalah parameter opsional karena ada tanda tanya di akhir dari parameter name, apabila anda melewatkan nilai ini seharusnya request tetap bisa dijalankan.

Untuk mengisi parameter, anda perlu membuat Object dengan nama key sama persis dengan nama route (harus sama, apabila tidak sama maka mapping akan gagal). Contoh dengan post.path1

javascript
// Tanpa optional param
pnrRequest
    .setBody({})
    .post('path1', {
        withParam: 'nilainya'
    }) // Seharusnya work like a charm menjadi "/hello/world/nilainya" :D
    .then() // Karena return Promise AxiosResponse, maka bisa dihandle seperti biasa
    .catch()
    .finally();

// Dengan optional param
pnrRequest.setBody({}).post('path1', {
    withParam: 'nilainya',
    withOptionalParam: 'xyz'
}); // Seharusnya work like a charm menjadi "/hello/world/nilainya/xyz" :D

// Contoh salah
pnrRequest.setBody({}).post('path1', {
    withOptionalParam: 'nilainya'
}); // Request gagal karena tidak ada nilai untuk `withParam`. URL yang terbentuk "/hello/world//nilainya"

// Contoh yang ngga terlalu guna :"D
pnrRequest.setBody({}).post('path1', {
    withParam: 'nilainya',
    akuNulisNgawur: '123' // Untuk ini ya percuma, karena ngga akan map kemanapun :D
}); // Seharusnya work like a charm :D