
Gọi REST API nội bộ (ERP/PLM) bằng urllib: tra mã vật tư, có timeout, xử lý lỗi và thử lại
#Python#Tích hợp#REST1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Mã vật tư, giá, tồn kho nằm trong hệ thống ERP. Script NX có thể hỏi API nội bộ ngay khi cần mà không cần cài thư viện ngoài, chỉ dùng urllib của Python.
Gọi REST API nội bộ (ERP/PLM) bằng urllibCác bước thực hiện
- Chuẩn bị địa chỉ và khóa. Đọc từ cấu hình, không viết cứng vào code.
- Gọi GET có timeout. urllib.request.urlopen.
- Phân tích JSON. json.loads.
- Xử lý lỗi mạng và HTTP. URLError, HTTPError.
- Thử lại có giới hạn. Chỉ với lỗi tạm thời.
Code tham khảo (Python)
import json import os import time import urllib.error import urllib.parse import urllib.request import NXOpen def goi_api(duong_dan, tham_so=None, so_lan=3, timeout=8): goc = os.environ.get("NXLAB_ERP_URL", "http://erp.noi-bo.local/api") khoa = os.environ.get("NXLAB_ERP_KEY", "") url = goc.rstrip("/") + "/" + duong_dan.lstrip("/") if tham_so: url += "?" + urllib.parse.urlencode(tham_so) yeu_cau = urllib.request.Request(url, headers={"Accept": "application/json", "Authorization": "Bearer " + khoa}) cho = 1.0 for lan in range(1, so_lan + 1): try: with urllib.request.urlopen(yeu_cau, timeout=timeout) as phan_hoi: return json.loads(phan_hoi.read().decode("utf-8")) except urllib.error.HTTPError as ex: if ex.code in (500, 502, 503, 504) and lan < so_lan: time.sleep(cho); cho *= 2 continue raise RuntimeError("API trả lỗi HTTP %d" % ex.code) except (urllib.error.URLError, TimeoutError) as ex: if lan < so_lan: time.sleep(cho); cho *= 2 continue raise RuntimeError("Không kết nối được ERP: %s" % ex) def tra_ma_vat_tu(ma): return goi_api("materials", {"code": ma}) def main(): lw = NXOpen.Session.GetSession().ListingWindow lw.Open() part = NXOpen.Session.GetSession().Parts.Work if part is None: return try: kq = tra_ma_vat_tu("VT-000123") lw.WriteLine("Kết quả ERP: " + json.dumps(kq, ensure_ascii=False)) except RuntimeError as ex: lw.WriteLine("Lỗi: %s (script vẫn chạy tiếp được ở chế độ ngoại tuyến)" % ex) if __name__ == "__main__": main()Giải thích code
- Địa chỉ và khóa API đọc từ biến môi trường, không nằm trong file code.
- Chỉ thử lại với lỗi mạng và lỗi máy chủ 5xx; lỗi 4xx (sai yêu cầu) thử lại cũng vô ích.
- Luôn có
timeout, nếu không NX có thể treo khi máy chủ không phản hồi.
Lỗi thường gặp
- Địa chỉ và khóa trong ví dụ là giả định; thay bằng hệ thống thật và quản lý khóa theo chính sách bảo mật của công ty.
- Không gọi API trong vòng lặp hàng nghìn lần; gom yêu cầu hoặc cache kết quả.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.