1 of 104

Rust Axum

Eko Kurniawan Khannedy

2 of 104

Eko Kurniawan Khannedy

3 of 104

Eko Kurniawan Khannedy

4 of 104

Sebelum Belajar

  • Rust Dasar
  • Rust Unit Test
  • Rust Concurrency
  • Rust Validation
  • Rust Template

5 of 104

Pengenalan

6 of 104

Axum

  • Axum adalah salah satu library untuk web di Rust yang populer
  • Axum terintegrasi baik dengan library Tokio, sehingga jika kita sudah terbiasa menggunakan Tokio, kita bisa menggunakan Axum dengan mudah
  • Axum merupakan library minimalis, sehingga sangat mudah menggunakannya
  • Axum menggunakan ekosistem library yang sudah ada, seperti Tokio, Tower dan Hyper, sehingga memudahkan ketika menggunakan library-library yang sudah terintegrasi dengan ekosistem tersebut dengan baik
  • https://github.com/tokio-rs/axum
  • https://crates.io/crates/axum

7 of 104

Membuat Project

8 of 104

Membuat Project

  • cargo new belajar-rust-axum

9 of 104

Menambah Library

  • cargo add tokio --features full
  • cargo add tower
  • cargo add serde --features derive
  • cargo add http
  • cargo add axum
  • cargo add axum-extra
  • cargo add axum-test
  • cargo add anyhow

10 of 104

Setup

11 of 104

Setup

12 of 104

Kode : Setup

13 of 104

Test

14 of 104

Test

  • Saat kita membuat web menggunakan Axum, kadang agak menyulitkan jika kita harus melakukan test secara manual
  • Untungnya, ada library untuk integration test Axum, sehingga kita tidak perlu menjalankan web Axum secara manual lagi
  • https://crates.io/crates/axum_test

15 of 104

Menggunakan Axum Test

16 of 104

Kode : Test

17 of 104

Router

18 of 104

Router

  • Struct Router merupakan objek utama dalam Axum yang digunakan untuk memetakan antara path dan kode yang dieksekusi ketika path tersebut diakses
  • Untuk menambahkan pemetaan baru, kita bisa menggunakan method route(path, method_router)
  • https://docs.rs/axum/latest/axum/struct.Router.html#method.route

19 of 104

Path

  • Path di Router merupakan tipe data &str yang berisikan lokasi Path di URL, misal contohnya :
    • /
    • /path
    • /path/nested/path
  • Pembuatan path harus dipastikan unik, jika ada yang duplikat, maka akan terjadi error

20 of 104

Method Router

21 of 104

Kode : Routing

22 of 104

Request

23 of 104

Request

24 of 104

Kode : Request

25 of 104

Extractor

26 of 104

Extractor

  • Walaupun mendapatkan informasi HTTP Request dari objek Request sudah lengkap, namun, kadang banyak hal yang harus kita lakukan secara manual untuk mendapatkan informasinya
  • Misal jika ingin mendapatkan informasi Query Param, Header, Cookie, Body, dan lain-lain
  • Axum menyediakan fitur bernama Extractor, yaitu fitur yang digunakan untuk mempermudah mengambil informasi dari Request
  • Extractor merupakan implementasi dari Trait FromRequest dan FromRequestParts
  • https://docs.rs/axum/latest/axum/extract/trait.FromRequest.html
  • https://docs.rs/axum/latest/axum/extract/trait.FromRequestParts.html

27 of 104

Http Extractor

  • Axum menggunakan standard library http, sehingga kita bisa dengan mudah menggunakan banyak sekali ekosistem library http yang sudah banyak diadopsi di komunitas Rust
  • Salah satunya kita bisa gunakan Extractor untuk data-data di Http Library
  • https://crates.io/crates/http
  • Sebelumnya, kita sudah menggunakan Request pada routing function yang kita buat, selain itu, kita juga bisa gunakan banyak sekali http object yang tersedia, seperti Uri dan Method

28 of 104

Kode : Http Extractor

29 of 104

Common Extractor

30 of 104

Common Extractor

  • Ada banyak sekali extractor yang disediakan di Axum selain Http Extractor, kita bisa melihat semua daftar extractor yang tersedia pada module axum::extrac
  • https://docs.rs/axum/latest/axum/extract/index.html

31 of 104

Query Extractor

32 of 104

Kode : Query Extractor

33 of 104

Header Extractor

34 of 104

Kode : Header Extractor

35 of 104

Path Parameter Extractor

36 of 104

Path Parameter

  • Saat kita membuat Path dalam Routing, kadang ada kasus kita butuh Path yang sifatnya dinamis, contoh misal /products/123, dimana 123 adalah id product, yang artinya nilainya bisa berubah-ubah
  • Ini kita sebut dengan nama Path Parameter. Kita bisa membuat Path Parameter dengan menggunakan tanda { diikuti dengan nama parameter dan ditutup dengan }
  • Misal /products/{id}, artinya id adalah Path Parameter
  • Path Parameter bisa lebih dari satu, misal /products/{id}/categories/{id_category}

37 of 104

Path Parameter Extractor

  • Untuk mendapatkan nilai pada Path Parameter tersebut, kita bisa menggungkan Path Parameter Extractor yaitu Struct Path
  • https://docs.rs/axum/latest/axum/extract/struct.Path.html
  • Saat menggunakan Struct Path, kita perlu membuat nama attribute sesuai dengan nama Path Parameter nya

38 of 104

Kode : Path Extractor

39 of 104

Body Extractor

40 of 104

Body Extractor

  • Saat membuat Web, kita sering mengirim data melalui HTTP Body
  • Axum menyediakan banyak Extractor untuk HTTP Body, sehingga kita bisa mudah ketika akan mengambil data di HTTP Body

41 of 104

String Body Extractor

  • Axum menyediakan Extractor untuk mengambil data di Request Body dalam tipe data String
  • Kita bisa menggunakan tipe String pada routing function, yang secara otomatis data String tersebut akan diambil dari Request Body

42 of 104

Kode : String Body Extractor

43 of 104

Json Body Extractor

  • Selain tipe data String, kadang kita ingin request body dalam bentuk JSON. Jika menggunakan String, kita harus lakukan konversi manual dari String JSON menjadi tipe Object yang kita mau
  • Axum menyediakan Extractor untuk Request Body tipe JSON, yaitu dengan menggunakan Struct Json, sehingga kita bisa konversi otomatis menjadi tipe yang kita inginkan
  • Fitur ini menggunakan Serde untuk melakukan konversi tipe data JSON ke tipe object yang kita mau
  • https://docs.rs/axum/latest/axum/struct.Json.html

44 of 104

Kode : Login Struct

45 of 104

Kode : Json Extractor

46 of 104

Json Error

47 of 104

Kode : Json Rejection

48 of 104

Response

49 of 104

Response

50 of 104

Kode : Response

51 of 104

Json Response

  • Struct Json, selain bisa digunakan sebagai Request Body, bisa juga digunakan sebagai Response
  • Struct Json akan secara otomatis mengubah object menjadi format Json menggunakan Serde
  • Hal ini mempermudah kita tanpa harus melakukan konversi ke format Json secara manual lagi
  • Kita bisa langsung gunakan return Json<T>

52 of 104

Kode : Json Response

53 of 104

Tuple IntoResponse

54 of 104

Kode : Tuple IntoResponse

55 of 104

Form Request

56 of 104

Form Request

  • Saat kita membuat Web, kadang kita membuat aksi Form Request
  • Axum juga menyediakan Extractor untuk Form Request, dimana kita bisa menyimpan hasil Request Body Form tersebut ke dalam object Struct yang kita perlukan
  • Kita bisa menggunakan Struct Form
  • https://docs.rs/axum/latest/axum/struct.Form.html
  • Axum menggunakan Serialize untuk mengkonversi Request Body Form menjadi object Struct yang kita inginkan

57 of 104

Kode : Form Request

58 of 104

Multipart Request

59 of 104

Multipart Request

  • Selain Form, Axum juga menyediakan Extractor untuk menangani Multipart Request menggunakan struct Multipart
  • https://docs.rs/axum/latest/axum/extract/struct.Multipart.html
  • Karena Multipart Request memerlukan membaca seluruh data Request Body, maka untuk Multipart Request, kita perlu tambahkan sebagai parameter di bagian paling akhir jika menggunakan lebih dari satu Extractor
  • Multipart di Axum memerlukan features multipart, kita bisa tambahkan --features multipart, ketika menambah library axum

60 of 104

Kode : Multipart Request (1)

61 of 104

Kode : Multipart Request (2)

62 of 104

Cookie

63 of 104

Cookie

  • Saat kita membuat Web, kadang kita butuh membuat Cookie
  • Sebenarnya cara membuat Cookie sendiri kita bisa lakukan secara manual menggunakan Response Header Set-Cookie
  • Namun, kita bisa gunakan library axum-extra untuk membantu melakukan manajemen Cookie secara mudah
  • https://crates.io/crates/axum-extra

64 of 104

Menambah Axum Extra

  • cargo add axum-extra --features cookie

65 of 104

Cookie Jar

  • Untuk menambah fitur Cookie, kita bisa menggunakan Struct CookieJar
  • https://docs.rs/axum-extra/latest/axum_extra/extract/cookie/struct.CookieJar.html
  • CookieJar secara otomatis akan mengambil Cookie yang ada di Request, karena CookieJar mengimplementasikan FromRequest
  • Jika kita ingin membuat Cookie, kita bisa kembalikan CookieJar dalam Response, karena CookieJar juga mengimplementasikan IntoResponse

66 of 104

Kode : Cookie Response

67 of 104

Kode : Cookie Request

68 of 104

Middleware

69 of 104

Middleware

  • Middleware adalah fitur dimana kita bisa melakukan sesuatu sebelum routing function di eksekusi
  • Banyak yang menggunakan Middleware untuk melakukan manipulasi request sebelum dikirim ke routing function atau manipulasi response sebelum dikembalikan ke pengguna
  • Axum tidak memiliki fitur Middleware sendiri, Axum menggunakan library Tower untuk menambah fitur Middleware. Keuntungannya adalah ekosistem Tower bisa digunakan di Axum
  • https://crates.io/crates/tower-http

70 of 104

Axum Middleware

  • Untuk menambahkan Middleware di Axum nya, kita bisa gunakan di level Router menggunakan Router::layer / Router::route_layer
  • Jika kita tambahkan di Router, artinya semua routing akan menggunakan Middleware tersebut
  • Atau kita bisa tambahkan di MethodRouter::layer / MethodRouter::route_layer
  • Jika kita tambahkan di MethodRouter, artinya hanya routing tersebut yang akan menggunakan Middleware tersebut

71 of 104

Membuat Middleware

72 of 104

Kode : Log Middleware

73 of 104

Kode : Request ID Middleware

74 of 104

Kode : Menggunakan Middleware

75 of 104

Error Handling

76 of 104

Tower Service Error

77 of 104

Axum Error Handling

  • Karena di Axum tidak mungkin mengembalikan Error, oleh karena itu biasanya saat kita membuat routing function, kita bisa membuat jenis Struct yang merepresentasikan sebagai error, dan mengimplementasikan IntoResponse agar Axum bisa mengubah menjadi Response

78 of 104

Kode : AppError

79 of 104

Kode : Error Handling

80 of 104

Unexpected Error

  • Jika kita menggunakan Axum Routing, seharusnya Error tidak akan terjadi, karena kita tidak akan membuat routing yang mengembalikan error
  • Namun, jika misal kita menggunakan ekosistem nya Tower, bisa aja kita menggunakan library lain yang mengembalikan Error
  • Pada kasus ini, kita bisa memberi tahu Axum, bagaimana mengubah Error tersebut menjadi Response
  • Untuk menangani hal ini, kita bisa menggunakan struct HandleError
  • https://docs.rs/axum/latest/axum/error_handling/struct.HandleError.html

81 of 104

Kode : Handle Error (1)

82 of 104

Kode : Handle Error (2)

83 of 104

State

84 of 104

State

  • Saat kita membuat aplikasi, kita sering sekali sharing data antar routing handle, misal koneksi database, koneksi http client, dan lain-lain
  • Data tersebut tidak mungkin kita buat di tiap routing, biasanya kita buat sekali dan kita sharing ke semua routing
  • Axum memiliki fitur untuk sharing state seperti ini, dan ada beberapa cara untuk melakukan sharing state
  • Menggunakan extractor, menggunakan request extension dan menggunakan closure capture

85 of 104

State Extractor

86 of 104

Kode : State Extractor

87 of 104

State Extension

  • Selain menggunakan Extractor, kita bisa menggunakan Extension sebagai Layer
  • Solusi ini mirip seperti Extractor, namun kekurangannya adalah jika kita sampai lupa menambah Extention, maka akan terjadi Runtime Error dan menjadi response 500 Internal Server Error
  • Kelebihan Extractor adalah tidak akan terjadi Runtime Error, karena pengecekan sudah dilakukan pada waktu Compile
  • https://docs.rs/axum/latest/axum/struct.Extension.html

88 of 104

Kode : State Extension

89 of 104

Closure Capture

  • Cara terakhir adalah menggunakan Closure Capture yang pernah kita bahas di materi Rust Concurrency tentang Atomic Reference
  • Cara ini sangat bertele-tele, jadi sebenarnya tidak terlalu direkomendasikan, lebih baik gunakan cara sebelumnya menggunakan Extractor atau Extension

90 of 104

Kode : Closure Capture

91 of 104

Multiple Router

92 of 104

Merge Multiple Router

  • Sebelumnya, kita hanya membuat satu buah object Router
  • Namun sebenarnya kita bisa mengkombinasikan beberapa object Router
  • Hal ini bisa mempermudah untuk maintain ketika aplikasi yang kita buat sudah lumayan banyak dan tiap Router memiliki Middleware yang berbeda-beda
  • Kita bisa menggunakan method merge pada Router untuk menambahkan Router lain
  • https://docs.rs/axum/latest/axum/struct.Router.html#method.merge

93 of 104

Kode : Merge Multiple Router

94 of 104

Nest Multiple Router

  • Selain merge, ada juga method yang digunakan untuk menggabungkan beberapa router, yaitu nest()
  • Bedanya adalah, jika merge, kita akan menggunakan Path asli dari Router, jika nest kita bisa menambahkan prefix pada Router yang akan kita tambahkan
  • https://docs.rs/axum/latest/axum/struct.Router.html#method.nest

95 of 104

Kode : Nest Multiple Router

96 of 104

Fallback

97 of 104

Fallback

  • Apa yang terjadi jika kita mengakses URL yang tidak ada di Router?
  • Secara otomatis Axum akan mengembalikan 404 Not Found tanpa Body apapun
  • Kadang, mungkin kita ingin mengembalikan seperti halaman khusus ketika URL yang dibuka memang tidak ada
  • Kita bisa menggunakan method fallback() pada Router
  • Namun perlu diperhatikan, fallback() hanya bisa satu, artinya jika kita menggunakan merge multiple Router, maka fallback() yang Router terakhir yang akan digunakan

98 of 104

Kode : Fallback

99 of 104

Method Not Allowed Fallback

  • Selain fallback untuk 404, ada juga fallback untuk Method Not Allowed
  • Fallback ini terjadi jika Path nya ada di Router, namun HTTP Method nya tidak didukung
  • Misal kita memiliki route GET /hello, tapi kira mengakses POST /hello
  • Maka fallback Method Not Allowed akan dipanggil
  • Kita bisa mengubahnya dengan menggunakan method method_not_allowed_fallback()
  • https://docs.rs/axum/latest/axum/struct.Router.html#method.method_not_allowed_fallback

100 of 104

Kode : Method Not Allowed Fallback

101 of 104

Referensi

102 of 104

Referensi

103 of 104

Materi Selanjutnya

104 of 104

Materi Selanjutnya

  • Membuat RESTful API
  • Dan lain-lain