Akka Http là một module của Akka được phát triển dựa trên akka-actor và akka-stream. Ta có thể sử dụng Akka Http ở cả server và client-side. Tuy nhiên, cần lưu ý rằng Akka Http không phải là một web-framework như Angular JS hoặc Spring mà là một tookit để phát triển hoặc để sử dụng các HTTP-based services. Do đó, chúng ta thường không sử dụng Akka Http để xây dựng các Web Application mà chỉ sử dụng Akka Http cho mục đích tích hợp với HTTP (ví dụ như sử dụng ReactJS để thiết kế User Interface còn sử dụng Akka Http để tạo các Restful API nhằm đọc dữ liệu từ Database và truyền đến UI).

Akka Http cung cấp DSL (Domain Specific Language) để mô tả các HTTP Routes và cách sử dụng chúng. Mỗi một Route lại được chia thành các phần nhỏ hơn gọi là Directive nhằm xử lý một loại request cụ thể. Ví dụ như một Route có thể bắt đầu với việc tìm path tương ứng của một request (ví dụ: localhost/getInfo) rồi thu hẹp thành việc chỉ xử lý HTTP GET request hoặc POST request.

Việc truyền dữ liệu request và reponse trong Akka Http được thực hiện bởi Marshallers và không liên quan đến việc định nghĩa Route. Do đó dữ liệu trả về có thể ở bất cứ định dạng nào, miễn là Marshallers hỗ trợ định dạng đó. Định dạng dữ liệu mặc định của Marshaller là String hoặc ByteString. Tuy nhiên, người dùng có thể định nghĩa các định dạng riêng sử dụng JSON (thông qua thư viện spray-json).

Trong bài tutorial này, chúng ta sẽ viết một chương trình sử dụng Akka Http để tạo Resful API nhằm xử lý GET và POST request với chức năng truy xuất và ghi dữ liệu vào Cassandra Database (các bạn có thể tham khảo thêm tutorial về Cassandra tại đây).

Trước hết ta thêm dependencies sau vào file pom.xml:

Do Akka Http sử dụng akka-actor và akka-stream nên ta cần định nghĩa các biến sau (xem thêm tutorial về akka-actorakka-stream)

Tiếp theo ta thực hiện kết nối với Cassandra Database để thực hiện việc đọc và ghi vào emp table của testkeyspace (emp table đã tạo ra trong bài Viết chương trình Cassandra cơ bản).

Emp table có tất cả 5 column, do đó ta định nghĩa Employee class với 5 variables tương ứng và sử dụng akka-http-spray-json để marshal và unmarshal dữ liệu như sau:

Trong hàm main, ta định nghĩa một Route với hàm GET và POST như sau:

– GET: có đường dẫn là /getAll với mục đích trả về kết quả là thông tin về các employee. Ở đây ta viết hàm cassandraReader(query: String) để đọc dữ liệu từ emp table

– POST: có đường dẫn là /insertData nhằm tiếp nhận dữ liệu mà người dùng gửi về rồi lưu vào database (emp table)

Cuối cùng ta thiết lập host và port cho chương trình và cho phép người dùng nhấn Enter để dừng chạy Akka server như sau:

Để kiểm tra hoạt động của REST API vừa tạo ra ở trên, ta chạy chương trình rồi truy cập vào địa chỉ http://localhost:8080/getAll bằng một trình duyệt bất kỳ, ta sẽ nhận được kết quả là thông tin về các employee có trong emp table như sau:

Ta kiểm tra chức năng POST bằng cách mở một cửa sổ terminal và dùng lệnh curl như sau (khi chương trình xử lý POST request thành công sẽ trả về thông báo “Data inserted !!!”):

Vào lại địa chỉ http://localhost:8080/getAll để kiểm tra lại kết quả, ta thấy rằng dữ liệu người dùng gửi về đã được ghi thành công vào emp table.

Như vậy, chúng ta đã hoàn thành việc viết một chương trình sử dụng Akka HTTP để tạo Resful API nhằm xử lý GET và POST request với chức năng đọc và ghi dữ liệu vào Cassandra Database. Các bạn có thể tham khảo full code của chương trình dưới đây.

Tháng Ba 10, 2019
ITechSeeker