Driver Library digunakan untuk mengakses koleksi API yang sebelumnya telah didefinisikan
pada spesifikasi API. Namespace API
dapat diakses melalui your-blueprint/driver
. Pada
namespace API
terdapat kelas Driver
yang menggunakan design pattern Singleton.
interface DriverParameters {
base_url: string;
intercept?: {
request?: boolean;
response?: boolean;
};
}
namespace API {
class Driver {
static instance(): Driver;
init(parameters: DriverParameters): Driver;
driver: { [path: string]: <Koleksi Objek Endpoint> };
}
}
Untuk mengakses koleksi API, pengguna harus menginisialisasi kelas Driver
terlebih dahulu.
Contoh inisialisasi kelas Driver
:
const driver_instance: API.Driver = API.Driver
.instance()
.init({ base_url: 'http://localhost:9000' });
lalu mengakses koleksi API melalui atribut driver
pada kelas API.Driver
const driver_instance: API.Driver = API.Driver
.instance()
.init({ base_url: 'http://localhost:9000' });
const caller = driver_instance.driver['<endpoint path>']['<endpoint path>']();
Struktur data driver: { [path: string]: <Koleksi Objek Endpoint> };
disusun
dengan urutan metode endpoint terlebih dahulu lalu diikuti path endpoint
dan menghasilkan fungsi lambda untuk memanggil API tersebut. Sehingga konstanta
caller
pada kutipan kode di atas adalah sebuah fungsi lambda untuk mengeksekusi
pemanggilan API.
Fungsi pemanggil API caller
memiliki satu parameter objek yang berisi
kelompok parameter sesuai spesifikasi API seperti pada Data Model.
Misal spesifikasi API sbb:
title: Sample App
paths:
/masuk:
post:
summary: |-
Masuk ke akun yang
sudah terdaftar
parameters:
data:
type: PayloadLogin
required: true
in: body
return:
type: object
required: true
children:
token:
type: string
required: true
user:
type: User
required: true
schemas:
PayloadLogin:
properties:
email:
type: string
required: true
password:
type: string
required: true
eksekusi fungsi caller
membutuhkan parameter objek PostRequestMasuk
dengan struktur sbb:
// berasal dari schemas
class PayloadLogin {
'email': string;
'password': string;
}
// berasal dari endpoint request
class PostRequestBodyMasuk {
'data': PayloadLogin;
}
interface PostRequestMasuk {
body: PostRequestBodyMasuk;
}
Berikut contoh penggunaan caller
dari contoh di atas pada ReactJS.
import { User } from 'your-blueprint/model';
import { API, Schema } from 'your-blueprint/driver';
export function SomePage() {
const [data, setData] = useState<Schema.PayloadLogin>({ email: '', password: '' });
async function submitLogin() {
const caller = API
.Driver
.instance()
.init({ base_url: 'http://localhost:9000' })
.driver
.post['/login']();
try {
const res: Schema.PostResponseMasuk = await caller({
body: {
data: data
}
});
} catch (err: any) {
alert(err.toString());
}
}
return (
<div>
<input
type={'email'}
value={data.email}
onChange={e => setData({ ...data, email: e.target.value })} />
<input
type={'password'}
value={data.password}
onChange={e => setData({ ...data, password: e.target.value })} />
<button
onClick={submitLogin}>
Login
</button>
</div>
);
}