Hướng dẫn toàn diện về thao tác JSON và giao tiếp API bằng Python|Giải thích cả xác thực và biện pháp bảo mật

1. JSON là gì?(Kiến thức cơ bản)

Tổng quan về JSON

JSON (JavaScript Object Notation) là định dạng dữ liệu thường được sử dụng để giao tiếp giữa client và server. Vì nhẹ, dễ đọc và có cấu trúc đơn giản nên nó được sử dụng rộng rãi trong các ứng dụng web và ứng dụng di động. JSON là định dạng văn bản nên rất linh hoạt và dễ xử lý trong hầu hết các ngôn ngữ lập trình.

Cấu trúc cơ bản của JSON

JSON biểu diễn dữ liệu dưới dạng cặp khóa – giá trị. Ví dụ, dưới đây là một cấu trúc JSON:

{
  "名前": "佐藤",
  "年齢": 30,
  "趣味": ["読書", "映画"]
}

Trong ví dụ này, 名前 là chuỗi, 年齢 là số, và 趣味 là mảng. Cấu trúc đơn giản và dễ đọc giúp việc truyền tải dữ liệu trở nên hiệu quả.

Ưu điểm của JSON

  1. Nhẹ và hiệu quả: Là định dạng văn bản nên lượng dữ liệu truyền tải ít, giúp giảm tải cho mạng.
  2. Tính tương thích cao: Hầu hết các ngôn ngữ lập trình đều hỗ trợ JSON, có thể sử dụng trên nhiều nền tảng khác nhau.
  3. Dễ phân tích: Dễ dàng đọc và ghi dữ liệu, đặc biệt hữu ích trong giao tiếp API.

2. Thao tác với JSON trong Python(Phần cơ bản)

Mô-đun json trong Python

Trong Python, bạn có thể dễ dàng đọc và ghi dữ liệu JSON bằng mô-đun json. Ví dụ, để chuyển đổi dữ liệu JSON thành kiểu dict trong Python, bạn dùng hàm json.loads().

import json

json_data = '{"名前": "佐藤", "年齢": 30}'
python_obj = json.loads(json_data)

print(python_obj)  # {'名前': '佐藤', '年齢': 30}

Ngược lại, để chuyển đổi đối tượng Python thành định dạng JSON, bạn sử dụng json.dumps().

python_obj = {"名前": "佐藤", "年齢": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)

print(json_data)  # {"名前": "佐藤", "年齢": 30}

Đọc và ghi file

Bạn cũng có thể đọc dữ liệu JSON từ file hoặc ghi dữ liệu vào file.

# Đọc từ file
with open('data.json', 'r') as f:
    data = json.load(f)

# Ghi vào file
with open('data.json', 'w') as f:
    json.dump(python_obj, f, ensure_ascii=False)
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Giao tiếp JSON với Python(Phần thực hành)

Giao tiếp API bằng mô-đun requests

Với mô-đun requests, bạn có thể dễ dàng gửi và nhận dữ liệu JSON thông qua API. Dưới đây là ví dụ gửi JSON bằng yêu cầu POST và nhận phản hồi.

Gửi dữ liệu JSON bằng POST request

import requests

url = 'https://example.com/api'
data = {'名前': '佐藤', '年齢': 30}

response = requests.post(url, json=data)
json_response = response.json()

print(json_response)

Nhận dữ liệu JSON bằng GET request

Bạn cũng có thể dễ dàng lấy dữ liệu JSON từ API bằng cách sử dụng yêu cầu GET.

response = requests.get('https://example.com/api/user/1')
data = response.json()

print(data)

 

4. Xử lý lỗi và các phương pháp hay nhất

Xử lý lỗi trong giao tiếp API

Khi xảy ra lỗi trong quá trình giao tiếp API, điều quan trọng là cần xử lý lỗi một cách phù hợp. Ví dụ dưới đây cho thấy cách bắt các ngoại lệ như lỗi mạng hoặc timeout.

try:
    response = requests.post(url, json=data)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("Lỗi HTTP:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Lỗi kết nối:", errc)
except requests.exceptions.Timeout as errt:
    print("Lỗi timeout:", errt)
except requests.exceptions.RequestException as err:
    print("Lỗi khác:", err)

Xử lý thử lại (Retry)

Khi mạng không ổn định, việc triển khai cơ chế thử lại là rất quan trọng. Với mô-đun requests, bạn có thể dễ dàng thực hiện điều này bằng cách sử dụng lớp Retry.

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get(url)

5. Xác thực JSON

Xác thực bằng thư viện jsonschema

Để kiểm tra xem dữ liệu JSON nhận được từ API có đúng định dạng như mong đợi hay không, bạn có thể sử dụng thư viện jsonschema để thực hiện việc xác thực.

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "名前": {"type": "string"},
        "年齢": {"type": "number"}
    },
    "required": ["名前", "年齢"]
}

json_data = {"名前": "佐藤", "年齢": 30}

try:
    validate(instance=json_data, schema=schema)
    print("JSON hợp lệ")
except ValidationError as e:
    print("Lỗi xác thực:", e)

Thư viện này hỗ trợ các schema phức tạp và các đối tượng lồng nhau, giúp bạn xác minh chắc chắn rằng dữ liệu từ API là chính xác và an toàn để xử lý.

6. Các phương pháp bảo mật tốt nhất

Quản lý API key

Không nên ghi cứng (hard-code) API key vào trong mã nguồn. Thay vào đó, nên quản lý thông qua biến môi trường hoặc các phương pháp bảo mật khác. Điều này giúp giảm thiểu rủi ro bảo mật.

import os

api_key = os.getenv('API_KEY')

Sanitizing dữ liệu

Trước khi gửi dữ liệu người dùng đến server, cần thực hiện xử lý làm sạch (sanitize) dữ liệu đầu vào. Điều này giúp bảo vệ khỏi các tấn công như SQL injection hoặc cross-site scripting (XSS).

from html import escape

safe_data = escape(user_input)