Gabay sa JSON at API Python: Validasyon at Seguridad

1. Ano ang JSON? (Batayang Kaalaman)

Pangkalahatang Ideya ng JSON

Ang JSON(JavaScript Object Notation)ay isang format ng datos na madalas gamitin sa komunikasyon sa pagitan ng kliyente at server. Ito ay magaan, madaling basahin, at may simpleng estruktura, kaya malawakang ginagamit sa mga web application at mobile application. Ang JSON ay nasa anyong teksto, at madaling hawakan sa anumang wika, kaya napaka‑versatile nito.

Pangunahing Estruktura ng JSON

Ang JSON ay naglalarawan ng datos gamit ang pares ng susi at halaga. Halimbawa, narito ang isang estruktura ng JSON:
{
  "pangalan": "佐藤",
  "edad": 30,
  "libangan": ["pagbabasa", "pelikula"]
}
Sa halimbawang ito, ang pangalan ay isang string, ang edad ay isang numero, at ang libangan ay isang array. Dahil simple ang estruktura at mataas ang nababasa, napakaepektibo ang palitan ng datos.

Mga Bentahe ng JSON

  1. Magaan at Epektibo: Bilang isang text format, maliit ang dami ng data na ipinapadala kaya nababawasan ang load sa network.
  2. Mataas na Pagkakatugma: Sinusuportahan ng halos lahat ng programming language, at maaaring magamit sa maraming platform.
  3. Madaling I‑parse: Madali ang pagbabasa at pagsulat ng datos, at lalo na sa API communication ay isang makapangyarihang tool.

2. Pag-manipula ng JSON sa Python (Pangunahing Bahagi)

Python json na module

Sa Python, maaaring madaling magbasa at magsulat ng JSON data gamit ang json module. Halimbawa, upang i-convert ang JSON data sa Python dictionary, gamitin ang function na json.loads().
import json

json_data = '{"pangalan": "Sato", "edad": 30}'
python_obj = json.loads(json_data)

print(python_obj)  # {'pangalan': 'Sato', 'edad': 30}
Sa kabaligtaran, upang i-convert ang Python object sa JSON format, gamitin ang json.dumps().
python_obj = {"pangalan": "Sato", "edad": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)

print(json_data)  # {"pangalan": "Sato", "edad": 30}

Pagbabasa at Pagsusulat ng File

Maaari ring magbasa ng JSON data mula sa file o magsulat nito sa file.
# Magbasa mula sa file
with open('data.json', 'r') as f:
    data = json.load(f)

# Sumulat sa file
with open('data.json', 'w') as f:
    json.dump(python_obj, f, ensure_ascii=False)
侍エンジニア塾

3. JSON na komunikasyon sa Python (praktikal na bahagi)

Komunikasyon sa API gamit ang requests module

requests module, madaling makapagpadala at makatanggap ng JSON data sa pamamagitan ng API. Narito ang halimbawa ng pagpapadala ng JSON gamit ang POST request at pagtanggap ng tugon.

Pagpapadala ng JSON data gamit ang POST request

import requests

url = 'https://example.com/api'
data = {'pangalan': 'Sato', 'edad': 30}

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

print(json_response)

Pagtanggap ng JSON data gamit ang GET request

Madali rin kunin ang JSON data mula sa API gamit ang GET request.
response = requests.get('https://example.com/api/user/1')
data = response.json()

print(data)

4. Paghawak ng Error at Mga Pinakamahusay na Kasanayan

Paghawak ng Error sa API na Komunikasyon

Kapag nagkaroon ng error habang nagkokomunika sa API, mahalagang magsagawa ng tamang paghawak ng error. Sa halimbawang ito, kinukuha ang mga exception tulad ng network error at timeout.
try:
    response = requests.post(url, json=data)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("OOps: Something Else", err)

Pagproseso ng Retry

Kapag hindi matatag ang network, mahalaga ring magpatupad ng pagproseso ng retry. Sa requests module, madaling maipatupad ang retry gamit ang Retry class.
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. Pagpapatunay ng JSON

Pagpapatunay gamit ang jsonschema

Upang matiyak kung ang JSON data na natatanggap mula sa API ay nasa inaasahang format, maaari mong gamitin ang library na jsonschema upang magsagawa ng pagpapatunay.
from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "pangalan": {"type": "string"},
        "edad": {"type": "number"}
    },
    "required": ["pangalan", "edad"]
}

json_data = {"pangalan": "佐藤", "edad": 30}

try:
    validate(instance=json_data, schema=schema)
    print("JSON is valid")
except ValidationError as e:
    print("Validation Error:", e)
Maaari rin nitong suportahan ang mga kumplikadong schema at mga nested na object, na nagbibigay-daan upang masiguro ang wastong pagsusuri ng data mula sa API.

6. Mga pinakamahusay na kasanayan sa seguridad

Pamamahala ng API Key

Inirerekomenda na huwag i-hardcode ang API key sa source code, at imaneho ito gamit ang mga environment variable o katulad nito. Sa ganitong paraan, mababawasan ang panganib sa seguridad.
import os

api_key = os.getenv('API_KEY')

Sanitasyon ng Data

Sa pamamagitan ng pagsasagawa ng tamang sanitasyon sa input data mula sa user bago ito ipadala sa server, mapoprotektahan mo laban sa SQL injection at cross-site scripting (XSS).
from html import escape

safe_data = escape(user_input)