NX Lab

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

  1. 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 urllib Gọi REST API nội bộ (ERP/PLM) bằng urllib

    Các bước thực hiện

    1. Chuẩn bị địa chỉ và khóa. Đọc từ cấu hình, không viết cứng vào code.
    2. Gọi GET có timeout. urllib.request.urlopen.
    3. Phân tích JSON. json.loads.
    4. Xử lý lỗi mạng và HTTP. URLError, HTTPError.
    5. 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.