Đã bao giờ bạn thắc mắc tại sao chiếc smartphone của bạn có thể hiển thị thông tin thời tiết? Lẽ nào các ứng dụng thời tiết có cả một hệ thống trạm khí tượng và đội ngũ chuyên thu thập, xử lý, phân tích và đánh giá dữ liệu nhiệt độ, độ ẩm? Câu trả lời tất nhiên là không. Tại sao họ phải mất công làm điều không phải là chuyên môn của họ và đã có người khác làm thay? Khi mà họ chỉ cần yêu cầu trung tâm khí tượng cung cấp chúng là đã có thông tin cần thiết cho người dùng.
Đây chính là lý do chúng ta cần tới RestAPI, một công nghệ giúp truy ta truy cập và giao tiếp với các dịch vụ web mà không cần phải xử lý nghiệp vụ lõi. Bài viết này sẽ giải thích chi tiết về RestAPI và cách sử dụng.
RestAPI là gì?
Trước khi giải thích về RestAPI, mình sẽ giải thích từng phần nhé:
- API (Application Programming Interface): là các phương thức hoặc giao thức được sử dụng để kết nối các ứng dụng với nhau. Hiểu đơn giản, nó là trung gian để các ứng dụng có thể giao tiếp với nhau mà không gặp bất kỳ trở ngại nào.
- Rest (Representational State Transfer): nó là 1 kiểu kiến trúc được sử dụng để định nghĩa các ràng buộc để tạo dịch vụ web. Hiểu nôm na, nếu muốn truyền dữ liệu, chúng ta phải thông qua 1 đại diện, đại diện này yêu cầu các bên phải tuân thủ ràng buộc để dữ liệu có thể truyền đến đúng nơi, đúng cách.
Như vậy, RestAPI là phương thức làm cho việc kết nối với dịch vụ web trở nên dễ dàng và linh hoạt mà không cần phải quan tâm dịch vụ web làm như thế nào.
Các phương thức của RestAPI
Các phương thức của RestAPI phục vụ cho việc tạo lập, đọc, cập nhật, xóa dữ liệu (CRUD). Client thông qua các phương thức này để yêu cầu Server hiển thị, thêm, xóa, sửa nội dung theo yêu cầu. Hầu hết các phương thức của RestAPI sử dụng JSON (Javascript Object Notation) để truyền dữ liệu.
GET
Phương thức GET được sử dụng để lấy thông tin tài nguyên từ dịch vụ web. Phương thức GET sẽ trả về nội dung dưới dạng JSON kèm với status code 200 (OK) nếu thành công. Nếu có lỗi, nó sẽ trả về status code 404 (NOT FOUND), hoặc 400 (BAD REQUEST)
POST
Phương thức POST được tận dụng để tạo tài nguyên mới. Nếu tạo thành công, máy chủ sẽ trả về code 201, kèm với kiểu nội dung (thường là JSON), location tới tài nguyên đó kèm nội dung tài nguyên vừa tạo.
PUT
Được sử dụng để cập nhật nội bằng việc thay thế nội dung hiện có bằng nội dung mới. Nếu ID của nội dung cập nhật chưa tồn tại, PUT có thể tạo mới nội dung y như POST.
Patch
Cùng là chỉnh sửa nội dung, PATCH lại khác với PUT khi PATCH cập nhật nội dung bằng việc điều chỉnh nội dung sẵn có. Khác với PUT, PATCH không cần phải đưa ra toàn bộ nội dung cập nhật. PATCH chỉ đơn giản là tìm nội dung cần sửa, vá lại trường dữ liệu cần được cập nhật.
Delete
Được sử dụng để xóa tài nguyên được chỉ định bởi URI (uniform resource identifier)
Sử dụng RestAPI
Từ phía Client
GET
- Gửi yêu cầu truy vấn tất cả thông tin:
GET:/api/contents
- Gửi yêu cầu truy vấn thông tin với id 2:
GET:/api/contents/2
POST
Tạo nội dung mới
POST:/api/contents
{“field”:”value”}
PUT hoặc PATCH
PUT or PATCH:/api/contents/1
{“field”:”new_value”}
DELETE
DELETE:/api/contents/1
Từ phía WebService
Phần này không dành cho những client gọi API. Đây là template mẫu cho bản thân dịch vụ web để xử lý request từ client. Ở bước này, mình giả sử contents đã được truy vấn từ trước.
GET
@app.route('/api/contents', methods=['GET'])
def get_contents():
return jsonify(contents), 200 # Return all contents
@app.route('/api/contents/<int:content_id>', methods=['GET'])
def get_content(content_id):
content = contents.find(content_id)
if content:
return jsonify(content), 200 # Return content by
return jsonify({"error": "Content not found"}), 404 # Not found
POST
@app.route('/api/contents', methods=['POST'])
def create_content():
content = request.json
new_id = len(contents)
contents['id'] = new_id
contents[new_id] = content
# Update in DB here
return jsonify(contents[new_id]), 201 # Created
PUT & PATCH
# PUT - Update content
@app.route('/api/contents/<int:content_id>', methods=['PUT'])
def update_content(content_id):
content = request.json
if content_id in contents:
content['id'] = content_id
contents[content_id] = content
# Update in DB here
return jsonify(contents[content_id]), 200 # Updated
else:
content['id'] = content_id
contents[content_id] = content
# Update in DB here
return jsonify(contents[content_id]), 201 # Created
# PATCH - Modify content
@app.route('/api/contents/<int:content_id>', methods=['PATCH'])
def modify_content(content_id):
if content_id not in contents:
return jsonify({"error": "Content not found"}), 404 # Not Found
updates = request.json
for key, value in updates.items():
if key in contents[content_id]:
contents[content_id][key ] = value
# Update in DB here
return jsonify(contents[content_id]), 200 # Updated
DELETE
# DELETE - Delete a content
@app.route('/api/contents/<int:content_id>', methods=['DELETE'])
def delete_content(content_id):
if content_id in contents:
del contents[content_id ]
# Update in DB here
return jsonify({"message": "Content deleted"}), 200 # Deleted
return jsonify({"error": "Content not found"}), 404 # Not found
Kết luận
Thay vì tự code mọi thứ, RestAPI giúp các developer tiết kiệm rất nhiều thời gian, công sức, tiền bạc khi tìm đến các dịch vụ web có khả năng làm điều tương tự với mức giá phải chăng.
“Đừng bao giờ tự làm những gì mà công sức và chi phí bỏ ra tốn kém hơn khi mua”
– Adam Smith
Tham khảo
- REST API Introduction – GfG
- What Is a REST API? Examples, Uses, and Challenges – Postman
- HTTP response status codes – Mozilla
Để lại một bình luận