Sử dụng JSON để truyền nhận dữ liệu trong Restful

Trong bài Sử dụng tham số đường dẫn khi tạo Restful url, các bạn đã biết các truyền dữ liệu theo kiểu tham số của url endpoint rồi. Trong bài này, tui sẽ nói về việc sử dụng JSON để truyển nhận dữ liệu giữa Client và Server, nhưng trước tiên tui phải nói sơ qua JSON cho những ai chưa bao giờ biết JSON là gì.

1. JSON là gì?

JSON là viết tắt của cụm từ JavaScript Object Notation. Do Client chủ yếu sử dụng Javascript để tương tác và JSON chính là cách biểu diễn đối tượng trong Javascript luôn nên không cần phải có các bước parsing phức tạp như đối với XML. Đối với JSON, ta chỉ cần Key-Value để biểu diễn đối tượng cũng như dữ liệu. Ví dụ như sau:

Cặp dấu móc { } sẽ định nghĩa đó là một object, và trong object, có thể chứa object khác, ở đây property (hay là Key) “convertTo” là một object, còn các property khác là kiểu String. Để chứa nhiều object trong một array, ta dùng cặp dấu ngoặc vuông [ ].

Sơ sơ qua JSON là như vậy.

2. Lấy dữ liệu JSON từ Server bằng phương thức HTTP GET:

Ví dụ Client sẽ lấy danh sách các quyển sách thông qua endpoint http://localhost:9000/api/books, Server sẽ trả về danh sách giống như trên bằng JSON. Mở gile routes/api.php lên và thêm đoạn code sau:

$entries là một array chứa các array con là những quyển sách nha các bạn, hàm json() của đối tượng Response trong Laravel nó làm cái nhiệm vụ là convert cái array này sang JSON và trả về cho Client. Trong PHP, việc chuyển từ Array sang JSON và ngược lại rất dễ, các bạn sử dụng 2 cái hàm: json_encode() và json_decode() nha (search google để xem thêm nha). Còn trong Laravel thì nó đã làm sẳn cho mình luôn rồi, nên chỉ việc dùng thôi.

Postman để xem nhé:

 

Giờ tui muốn là Server trả về một object, có một property là “books” cá value là một array chứa các quyển sách trên như vầy thì bên Laravel code làm sao:

Các bạn chỉ cần sửa biến $entries lại như sau:

Lại Postman:

Các bạn chú ý sẽ thấy là cái key trong JSON nó giống với cái key trong Array của PHP nha các bạn.

3. Send dữ liệu JSON về Server bằng phương thức HTTP POST:

Cũng là endpoint http://localhost:9000/api/books nhưng với phương thức POST, chúng ta sẽ gửi về Server một quyển sách mới, Server nhận và append vào danh sách hiện tại và trả lại danh sách mới này cho Client. ví dụ ở đây, danh sách hiện tại có 2 quyển sách rồi nhé:

Nếu viết PHP bình thường, chúng ta phải dùng hàm json_decode() để lấy dữ liệu từ trong JSON ra, nhưng trong Laravel thì nó đã tích hợp luôn cái việc đó trong đối tượng Request. Cho nên khi đó, việc lấy từng giá trị thông qua các key tương ứng cũng giống như lấy dữ liệu từ form POST như kiểu làm bình thường thông qua hàm input() của Request.

Postman tiếp:

Chọn tab Body ở phía trên, sau đó click chọn raw, và chọn kiểu dữ liệu gửi đi là JSON(application/json), khi đó, Postman sẽ tự động thêm cái Header là Content-Type: application/json, nếu không thì bên Server sẽ không nhận được dữ liệu là nội dung JSON nha các bạn.

Tiếp theo, các bạn nhập nội dung JSON cần gửi về Server ở cái khung Text ngay bên dưới, Chọn phương thức là POST và click Send thì các bạn sẽ thấy cái list trả về có thêm cái nội dung quyển sách mới.

Chú ý, cái Body ở trên là để chúng ta nhập dữ liệu và gửi về Server, còn Body bên dưới là kết quả trả về (nếu có) từ Server nha các bạn.

OK, vậy là xong rồi đó, hy vọng các bạn có thể hiểu được cách làm việc với JSON.

Read More

Sử dụng tham số đường dẫn khi tạo Restful url

Ở bài trước, tui đã làm một cái RESTful endpoint cho các bạn xem thấy cũng ngon ăn ha, dễ òm. Nhưng cuộc đời nó không có đơn giản như vậy và RESTful cũng thế. Trong bài hôm nay, tui sẽ nói về cách sử dụng tham số đường dẫn (path parameter) trong url endpoint.

1. Tham số đường dẫn:

Với một url endpoint, nếu đi với các HTTP verb khác nhau, chúng ta sẽ có những endpoint khác nhau. Do đó, nếu cùng một url endpoint, cùng 1 HTTP verb, nếu số lượng tham số đường dẫn khác nhau cũng sẽ tạo ra các endpoint khác nhau.

Nhìn cái hình trên chắc cũng rõ ràng hơn rồi ha. Đó là cách chúng ta truyền tham số từ phía Client, vậy bên Server chúng ta phải định nghĩa như thế nào để nhận các tham số đó.

Với Url đầu tiên, ta viết như thế này:

{name} là biến parameter của url endpoint, tương ứng với giá trị “peter”, tới chổ này, chúng ta chỉ mới làm cái chổ để nhận giá trị là “peter” thôi. Tiếp theo, chúng ta phải đưa được cái giá trị này vào trong cái hàm callback để xử lý. Trong hàm callback, chúng ta phải khai báo một biến parameter của hàm là $name, biến này là biến của PHP nha và tên biến nên giống tên biến trên cái url để dễ nhớ (các bạn có thể đặt tên biến của hàm callback là $name1, $your_name…, không nhất thiết phải giống nha, nhưng tui khuyên là nên giống, hehe). Túm lại là:

Thử thôi, mở file routes/api.php ra và viết cái đoạn code trên:

Mở Postman lên và gõ cái url: http://localhost:9000/api/hello/peter, kết quả là:

Các bạn có thể thử đổi tên biến $name thành $your_name, rồi thử coi sao nhé.

2. Thứ tự của các tham số đường dẫn trong url:

OK, coi như các bạn đã thử và chạy ngon. Ta xem tiếp cái url thứ 2:

Trên url ta có 2 parameters, thì bên dưới hàm callback cũng phải có 2 cái parameters tương ứng (tên biến thì đã nói như ở trên ha). Viết thử coi sao:

lại Postman:

Oh, quá ngon, chạy mượt. Nhưng giờ các bạn thử đổi thứ tự biến parameter của hàm callback xem sao từ $name, $age thành $age, $name, tên biến thì giữ nguyên y chang:

Postman again:

Ngạc nhiên chưa, giá trị của biến $age = {name} = peter và biến $name = {age} = 25. Tại sao lại bị vậy, lý do? Đó là do thứ tự các biến trên url và trong hàm callback không giống nhau. Vậy từ chổ này, các bạn nhớ cho tui là:

Khi sử dụng tham số đường dẫn, nếu có từ 2 tham số (parameter) trở lên: tên biến có thể giống/khác nhau, nhưng thứ tự các biến tham số phải giống nhau trên cả url và hàm callback

3. Tham số tùy chọn:

Giả sử tui có cái url endpoint như sau: http://localhost:9000/api/age-permission/{age}, nếu như từ 18 tuổi trở lên thì truyền age vào, còn nếu nhỏ hơn 18 tuổi thì không cần truyền:

Từ 18 ==> http://localhost:9000/api/age-permission/20

Dưới 18 ==> http://localhost:9000/api/age-permission

Khí đó các bạn sẽ cho biến {age} thành {age?} là một biến option và giá trị default của biến $age trong hàm callback là 17, viết như sau:

Nếu có từ 2 tham số trở lên, các tham số tùy chọn (option parameter) thường để ở phía sau cùng

Thử viết xem sao:

Still Postman:

 

Xong, các bạn từ từ khám phá nha. Hẹn gặp lại!

Read More

Restful là gì? Tạo restful api với Laravel 5

Dạo gần đây, tui có build một số RESTful web service (đại khái là tạo một tập hợp các api) để cho một số ứng dụng khác kết nối vào. Nhân tiện, tui sẽ viết một số bài về việc sử dụng Laravel (version lúc đang viết là 5.6) để tạo RESTful api. Kiến thức của tui có bao nhiêu, tui sẽ viết ra bấy nhiêu, mong là giúp được ít nhiều cho các bạn. Vậy Restful là gì? Xem tiếp nào!

Laravel cũng có một framework dạng rút gọn chỉ để làm RESTful, đó là lumen

1. RESTful là gì?

Trước khi viết RESTful api, thì chúng ta cũng cần hiểu cái chữ REST nó là gì để nếu các bạn có đi phỏng vấn xin việc mà bị người ta hỏi thì cũng biết đường mà trả lời.

REST là viết tắt của cụm từ: Respresentational State Transfer. REST dựa vào các verb của HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS) để truyền và nhận dữ liệu giữa Client và Server. Cùng một url (ví dụ: http://my-domain.com/api/user) hay còn gọi là endpoint, nhưng với GET thì ta có một endpoint, với POST ta lại có một endpoint khác (khác ở đây có nghĩa là cách xử lý và trả dữ liệu về cho client), điều này giúp chúng ta thuận tiện hơn trong việc quản lý các endpoint này, dễ chỉnh sửa và thay đổi hơn so với dùng SOAP.

Đối với một trang web bình thường (ví dụ như là wordpress chẳng hạn), khi web browser gửi một request thông qua cái url như trên thì Server sẽ xử lý và trả về một trang HTML, sau đó web browser nhận và hiển thị trang HTML này ra

Còn đối với RESTful thì client có thể là Web Browser hoặc cũng có thể là một Mobile App, thậm chí là một Web Service khác, thì dữ liệu truyền nhận qua lại chủ yếu là JSON.

Cuối cùng, một điều cần lưu ý là, mối quan hệ giữ Client và Server lúc này là Stateless, có nghĩa là Server không cần biết Client là ai, Server cũng không cần phải lưu session đối với client giống như website “truyền thống”. Server lúc này chỉ cần biết là: à, có một request tới và thỏa một số điều kiện của mình (cần access token chẳng hạn), và mình xử lý và trả dữ liệu cho Client thôi, chấm hết, không day dưa  Happy-Grin

2. Tạo Laravel project:

Trong phạm vi bài này, tui không hướng dẫn chi tiết cái Laravel ra sao nha, chỉ làm nhanh gọn các lệnh thôi sau đó review qua cái cấu trúc thư mục để viết Restful.

Tạo Laravel project:

Đứng ngay thư mục <learn-restful>, tạo app key:

Xong xuôi, các bạn sẽ có cây thư mục như thế này:

Laravel có cung cấp cho chúng ta một cái Web Server nho nhỏ, vừa đủ để test, không cần phải cái Apache luôn. Thử coi cái project có chạy ổn không, ngay tại thư mục <learn-restful> các bạn gõ lệnh:

Sau đó, mở Web Browser lên, gõ: http://localhost:9000 hoặc http://127.0.0.1:9000 xem coi có thấy chữ Laravel to đùng hiện ra không, nếu có thì coi như ta setup project ổn.

Nếu chạy lệnh trên mà không có tham số –port=9000, thì mặc định Server nó sẽ listen ở port 8000

3. Tạo endpoint cho Restful:

Cũng giống như làm web, chúng ta cũng cần phải tạo một cái route để làm endpoint. Trong thư mục routes, các bạn thấy các file sau:

Ở đây chúng ta đang bàn luận về Restful, nên chỉ chú ý đến file api.php thôi, đây là file chứa tất cả các endpoint dùng để xử lý các request từ client. Mở file api.php lên, các bạn thấy nội dung như sau:

Khoan hãy quan tâm đến 3 dòng code từ 16-18, chúng ta sẽ bàn sau. Các bạn chú ý là để nhận request từ client, các bạn phải import thư viện Illuminate\Http\Request nhé bằng từ khóa use

Tới đây, tui muốn tạo một url endpoint như sau: http://localhost:9000/api/hello-world, thì Server sẽ trả về nội dung là “Hello World! Welcome to codingpearls.com”. Mở file api.php, thêm đoạn code như sau:

Hàm Route::get(), có nghĩa là Server sẽ xử lý endpoint này với HTTP verb là GET. tham số thứ nhất chính là url (tạm gọi là part endpoint), tham số thứ 2 chính là một callback function xử lý tương ứng với enpoint này.

Chú ý, các bạn có thấy phân cách giữa domain hoặc subdomain với “hello-world” là chữ “api” không? Tại sao chúng ta không có gõ chữ “api” này trong cái endpoint mà trong cái url lại có. Đáng lẽ phải gõ endpoint là “/api/hello-world” mới đúng chứ? Ở đây các bạn có thể hiểu api chính là prefix của cái endpoint “hello-world”. Giả sử chúng ta có 10 cái endpoint, chẳng lẽ chúng ta lại phãi gõ chữ “api” 10 lần cho 10 cái endpoint à? Kiểu như vầy

Route::get(‘/api/hello-world’, function…)
Route::get(‘/api/hello-world1’, function…)
Route::get(‘/api/hello-world2’, function…)
Route::get(‘/api/hello-world3’, function…)

Để thuận tiện, Laravel mới tạo cái prefix là “api” để cho thuận tiện trong việc viết code, cũng như sửa prefix endpoint, và cái prefix này ở đâu? nó nằm trong file app\Providers\RouteServiceProvider.php.

Mở file này lên, tìm đến hàm mapApiRoutes():

Chính nó, hàm Route::prefix(‘api’), các bạn thử đổi chữ “api” thành chữ khác, ví dụ: “rest-api” chẳng hạn, xong gõ lại cái url là http://localhost:9000/rest-api/hello-world xem sao nhé.

Với Web browser, chúng ta không thể test được với các HTTP verb khác như POST, PUT, DELETE chẳng hạn. Do đó, chúng ta sẽ sử dụng cái app của Chrome là Postman để làm client. Các bạn search bằng từ khóa “chrome postman” rồi cài cái app này vào trình duyệt Chrome nhé. Và sau này sẽ dùng Postman là chính để test cái url endpoint.

Đây là giao diện của Postman:

Bài đầu tiên về RESTful đến đây là kết thúc, hẹn các bạn trong các bài kế tiếp để tìm hiểu sâu hơn về cách login, tạo token, cách sử dụng middleware để verify token, cách nhận json data từ client ..v.v.  Bye

Read More