Odoo API Integration: REST, JSON-RPC, and XML-RPC Guide

Complete developer guide to Odoo API integration using REST, JSON-RPC, and XML-RPC. Includes authentication, endpoints, code examples, and best practices.

E
ECOSIRE Research and Development Team
|19 مارچ، 202611 منٹ پڑھیں2.5k الفاظ|

Odoo API انٹیگریشن: REST، JSON-RPC، اور XML-RPC گائیڈ

Odoo 19 تین API انٹرفیس کو بے نقاب کرتا ہے جو سادہ ڈیٹا کی بازیافت سے لے کر پیچیدہ ورک فلو آٹومیشن تک ہر چیز کا احاطہ کرتا ہے۔ چاہے آپ ایک حسب ضرورت موبائل ایپ بنا رہے ہوں، فریق ثالث کے پلیٹ فارم کے ساتھ مطابقت پذیر ہوں، یا بیرونی مائیکرو سروسز کے ساتھ Odoo کی صلاحیتوں کو بڑھا رہے ہوں، Odoo API پرت میں مہارت حاصل کرنا کسی بھی سنجیدہ انضمام کے منصوبے کی بنیاد ہے۔

یہ گائیڈ ورکنگ کوڈ کی مثالیں، توثیق کے بہاؤ، اور REST، JSON-RPC، اور XML-RPC انضمام کے لیے تعمیراتی سفارشات فراہم کرتا ہے — Odoo 19 Enterprise میں دستیاب تین بنیادی انٹرفیس۔

اہم ٹیک ویز

  • Odoo 19 REST (OpenAPI 3.0)، JSON-RPC 2.0، اور XML-RPC انٹرفیس پیش کرتا ہے
  • توثیق API کیز (تجویز کردہ) یا سیشن پر مبنی لاگ ان کا استعمال کرتی ہے۔
  • JSON-RPC پیچیدہ آپریشنز کے لیے سب سے زیادہ خصوصیت سے بھرپور انٹرفیس ہے۔
  • REST API OpenAPI 3.0 spec کی پیروی کرتا ہے اور معیاری HTTP فعل کو سپورٹ کرتا ہے۔
  • XML-RPC میراثی ہے لیکن پھر بھی پسماندہ مطابقت کے لیے مکمل تعاون یافتہ ہے۔
  • شرح کو محدود کرنا اور غلطی سے نمٹنے کو کلائنٹ کی طرف سے لاگو کیا جانا چاہیے۔
  • Odoo 19 میں ویب ہکس ڈیٹا کو ریکارڈ کی تبدیلیوں پر بیرونی سسٹمز میں دھکیلتے ہیں۔
  • تمام API کالز Odoo کے رسائی کے حقوق اور ریکارڈ کے قوانین کا احترام کرتی ہیں۔

API انٹرفیس کا موازنہ

کوڈ کی ایک لائن لکھنے سے پہلے، اپنے استعمال کے معاملے کے لیے صحیح API انٹرفیس کا انتخاب کریں:

خصوصیتREST APIJSON-RPCXML-RPC
پروٹوکولHTTP/HTTPSHTTP/HTTPSHTTP/HTTPS
پے لوڈ فارمیٹJSONJSONXML
اوپن اے پی آئی اسپیکہاں (Swagger)نہیںنہیں
CRUD آپریشنزجی ہاںجی ہاںجی ہاں
طریقہ کالزمحدودمکملمکمل
ورک فلو ٹرگرزاعمال کے ذریعےexecute_kw کے ذریعےپھانسی کے ذریعے
کے لیے تجویز کردہنئے انضمامپیچیدہ منطقمیراثی نظام
Python لائبریریدرخواستیںodoo-xmlrpc / درخواستیںxmlrpc.client

ریسٹ کا استعمال کب کرنا ہے: ایک موبائل ایپ بنانا، ویب ہک-مقامی پلیٹ فارمز (Shopify، Stripe) کے ساتھ انضمام، یا جب آپ کی ٹیم REST کنونشنز کے ساتھ زیادہ آرام دہ ہو۔

JSON-RPC کا استعمال کب کرنا ہے: پیچیدہ Odoo سرور سائیڈ طریقوں پر عمل کرنا، ڈومین فلٹرز کے ساتھ بڑے ڈیٹا سیٹس کو پڑھنا، یا جب آپ کو REST کے ذریعے سامنے نہ آنے والے طریقوں تک رسائی کی ضرورت ہو۔

XML-RPC کا استعمال کب کرنا ہے: REST دستیاب ہونے سے پہلے بنائے گئے موجودہ انضمام کو برقرار رکھنا، یا جب آپ کے پلیٹ فارم میں XML-RPC کلائنٹ لائبریریاں بالغ ہوں۔


توثیق

API کلیدی توثیق (تجویز کردہ)

Odoo 19 تینوں انٹرفیس کے لیے API کلیدی تصدیق کی حمایت کرتا ہے۔ ترتیبات → صارفین → آپ کا صارف → API کیز کے تحت ایک API کلید بنائیں۔

import requests

ODOO_URL = "https://your-odoo.com"
API_KEY = "your_api_key_here"
DATABASE = "your_database"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

API کیز کا دائرہ مخصوص صارف کے لیے ہوتا ہے اور اس صارف کے رسائی کے حقوق کا وارث ہوتا ہے۔ انٹیگریشن اکاؤنٹس کے لیے کم سے کم مطلوبہ اجازتوں کے ساتھ وقف سروس صارفین بنائیں۔

سیشن پر مبنی توثیق (JSON-RPC / XML-RPC)

JSON-RPC کے لیے، سیشن قائم کرنے کے بعد /web/dataset/call_kw اینڈ پوائنٹ کا استعمال کرتے ہوئے تصدیق کریں:

import requests
import json

session = requests.Session()

# Authenticate
auth_payload = {
    "jsonrpc": "2.0",
    "method": "call",
    "params": {
        "db": "your_database",
        "login": "admin",
        "password": "your_password"
    }
}

response = session.post(
    f"{ODOO_URL}/web/session/authenticate",
    json=auth_payload
)
uid = response.json()['result']['uid']
print(f"Authenticated as UID: {uid}")

XML-RPC کے لیے، معیاری دو قدمی توثیق کا استعمال کریں:

import xmlrpc.client

url = "https://your-odoo.com"
db = "your_database"
username = "admin"
password = "your_password"

# Step 1: Get UID
common = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/common")
uid = common.authenticate(db, username, password, {})

# Step 2: Use UID for subsequent calls
models = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/object")

REST API: OpenAPI 3.0

Odoo 19 نے OpenAPI 3.0 تفصیلات کے ساتھ ایک مکمل REST API متعارف کرایا ہے۔ https://your-odoo.com/api/docs پر انٹرایکٹو دستاویزات تک رسائی حاصل کریں۔

لسٹنگ ریکارڈز

# GET /api/sale.order — list all sales orders
response = requests.get(
    f"{ODOO_URL}/api/sale.order",
    headers=headers,
    params={
        "domain": '[["state", "=", "sale"]]',
        "fields": '["name", "partner_id", "amount_total", "state"]',
        "limit": 50,
        "offset": 0
    }
)
orders = response.json()

ایک ریکارڈ پڑھنا

# GET /api/sale.order/{id}
order_id = 123
response = requests.get(
    f"{ODOO_URL}/api/sale.order/{order_id}",
    headers=headers
)
order = response.json()

ریکارڈ بنانا

# POST /api/sale.order
payload = {
    "partner_id": 42,
    "order_line": [
        {
            "product_id": 7,
            "product_uom_qty": 5,
            "price_unit": 100.0
        }
    ]
}
response = requests.post(
    f"{ODOO_URL}/api/sale.order",
    headers=headers,
    json=payload
)
new_order = response.json()

ریکارڈ کو اپ ڈیٹ کرنا

# PATCH /api/sale.order/{id}
response = requests.patch(
    f"{ODOO_URL}/api/sale.order/{order_id}",
    headers=headers,
    json={"note": "Rush order — priority handling required"}
)

ریکارڈ کو حذف کرنا

# DELETE /api/sale.order/{id}
response = requests.delete(
    f"{ODOO_URL}/api/sale.order/{order_id}",
    headers=headers
)

JSON-RPC انٹرفیس

JSON-RPC مکمل Odoo Python API تک رسائی فراہم کرتا ہے، بشمول سرور سائیڈ طریقے جو REST کے ذریعے ظاہر نہیں ہوتے ہیں۔ بنیادی اختتامی نقطہ /web/dataset/call_kw ہے۔

بنیادی تلاش اور پڑھیں

def call_kw(model, method, args, kwargs=None):
    payload = {
        "jsonrpc": "2.0",
        "method": "call",
        "params": {
            "model": model,
            "method": method,
            "args": args,
            "kwargs": kwargs or {}
        }
    }
    response = session.post(
        f"{ODOO_URL}/web/dataset/call_kw",
        json=payload
    )
    return response.json().get('result')

# Search for confirmed sales orders
order_ids = call_kw(
    "sale.order",
    "search",
    [[["state", "=", "sale"]]],
    {"limit": 100, "order": "date_order desc"}
)

# Read specific fields
orders = call_kw(
    "sale.order",
    "read",
    [order_ids],
    {"fields": ["name", "partner_id", "amount_total", "date_order"]}
)

تلاش پڑھیں (مشترکہ)

orders = call_kw(
    "sale.order",
    "search_read",
    [[["partner_id.country_id.code", "=", "US"]]],
    {
        "fields": ["name", "partner_id", "amount_total"],
        "limit": 50,
        "offset": 0,
        "order": "amount_total desc"
    }
)

ریکارڈز بنانا

new_id = call_kw(
    "sale.order",
    "create",
    [{
        "partner_id": 42,
        "order_line": [
            (0, 0, {
                "product_id": 7,
                "product_uom_qty": 10,
                "price_unit": 150.0
            })
        ]
    }]
)

کالنگ سرور سائیڈ کے طریقے

JSON-RPC Odoo ماڈلز پر بیان کردہ تمام Python طریقوں تک رسائی فراہم کرتا ہے:

# Confirm a sales order (triggers workflow)
call_kw("sale.order", "action_confirm", [[order_id]])

# Validate an inventory transfer
call_kw("stock.picking", "button_validate", [[picking_id]])

# Get the action for a button (useful for understanding what a button does)
action = call_kw("sale.order", "action_quotations_with_onboarding", [[]])

XML-RPC انٹرفیس

XML-RPC اصل Odoo API ہے اور مکمل طور پر تعاون یافتہ ہے۔ انٹرفیس دو اختتامی نقطوں پر مشتمل ہے:

  • /xmlrpc/2/common — غیر تصدیق شدہ طریقے (تصدیق، ورژن)
  • /xmlrpc/2/object — تمام ماڈل آپریشنز (UID کی ضرورت ہے)
import xmlrpc.client

url = "https://your-odoo.com"
db, username, password = "mydb", "admin", "mypassword"

common = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/common")
uid = common.authenticate(db, username, password, {})
models = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/object")

# Search for products
product_ids = models.execute_kw(
    db, uid, password,
    'product.template', 'search',
    [[['sale_ok', '=', True]]],
    {'limit': 100}
)

# Read product data
products = models.execute_kw(
    db, uid, password,
    'product.template', 'read',
    [product_ids],
    {'fields': ['name', 'list_price', 'categ_id']}
)

# Create a new product
new_product_id = models.execute_kw(
    db, uid, password,
    'product.template', 'create',
    [{
        'name': 'My New Product',
        'list_price': 99.99,
        'type': 'consu'
    }]
)

ڈومین فلٹرز

Odoo کا ڈومین فلٹر نحو تینوں API اقسام میں استعمال ہوتا ہے۔ ڈومینز کو سمجھنا موثر ڈیٹا کی بازیافت کے لیے ضروری ہے۔

# Basic operators: =, !=, >, <, >=, <=, like, ilike, in, not in, child_of
domain = [
    ["state", "in", ["sale", "done"]],      # Confirmed or done orders
    ["amount_total", ">=", 1000],            # Total at least 1000
    ["partner_id.country_id.code", "=", "US"] # US customers (related field)
]

# Logical operators: & (AND, default), | (OR), ! (NOT)
domain = [
    "|",
    ["state", "=", "draft"],
    ["state", "=", "cancel"]
]

# Complex: orders from US or UK customers with total > 5000
domain = [
    "|",
    ["partner_id.country_id.code", "=", "US"],
    ["partner_id.country_id.code", "=", "GB"],
    ["amount_total", ">", 5000]
]

ویب ہکس اور ایونٹ سے چلنے والا انٹیگریشن

Odoo 19 ریکارڈ تبدیلیوں کے ذریعے متحرک آؤٹ باؤنڈ ویب ہکس کو سپورٹ کرتا ہے۔ ویب ہکس کو ترتیبات → ٹیکنیکل → ویب ہکس کے تحت کنفیگر کریں۔

ویب ہُک کنفیگریشن:

  1. ترتیبات → ٹیکنیکل → ویب ہکس → تخلیق پر جائیں
  2. ماڈل سیٹ کریں (جیسے، sale.order)
  3. ٹرگر کو منتخب کریں: بنائیں، لکھیں، لنک ختم کریں، یا حسب ضرورت طریقہ
  4. اپنی وصول کرنے والی سروس کا اینڈ پوائنٹ URL درج کریں۔
  5. اختیاری طور پر ڈومین کو فلٹر کرنے کے لیے سیٹ کریں کہ کون سے ریکارڈ ویب ہک کو متحرک کرتے ہیں۔
  6. پے لوڈ میں شامل کرنے کے لیے فیلڈز کو کنفیگر کریں۔

فلاسک سروس میں ویب ہک ایونٹس وصول کرنا:

from flask import Flask, request, jsonify
import hmac, hashlib

app = Flask(__name__)
WEBHOOK_SECRET = "your_webhook_secret"

@app.route("/odoo-webhook", methods=["POST"])
def handle_webhook():
    # Verify signature
    signature = request.headers.get("X-Odoo-Signature")
    body = request.get_data()
    expected = hmac.new(
        WEBHOOK_SECRET.encode(),
        body,
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(signature, expected):
        return jsonify({"error": "Invalid signature"}), 401

    event = request.json
    model = event.get("model")
    record_id = event.get("id")

    # Process the event
    if model == "sale.order":
        handle_order_event(record_id, event)

    return jsonify({"status": "ok"}), 200

خرابی سے نمٹنے اور دوبارہ منطق کی کوشش کریں۔

مضبوط انضمام کو Odoo API کی غلطیوں کو احسن طریقے سے ہینڈل کرنا چاہیے۔

import time
import requests
from requests.exceptions import RequestException

def api_call_with_retry(url, payload, headers, max_retries=3, backoff=2):
    for attempt in range(max_retries):
        try:
            response = requests.post(url, json=payload, headers=headers, timeout=30)
            response.raise_for_status()

            data = response.json()
            if "error" in data:
                error = data["error"]
                code = error.get("code", 0)
                message = error.get("data", {}).get("message", "Unknown error")

                # Don't retry validation errors
                if code in [200, 100]:
                    raise ValueError(f"Odoo validation error: {message}")

                raise RuntimeError(f"Odoo API error {code}: {message}")

            return data.get("result")

        except (RequestException, RuntimeError) as e:
            if attempt == max_retries - 1:
                raise
            wait = backoff ** attempt
            print(f"Attempt {attempt + 1} failed: {e}. Retrying in {wait}s...")
            time.sleep(wait)

عام غلطی کے کوڈز:

کوڈمعنیایکشن
100سرور کی خرابیOdoo لاگز چیک کریں
200رسائی سے انکارصارف کی اجازت کی تصدیق کریں
300لاپتہ ریکارڈچیک کریں ریکارڈ ID موجود ہے
304مطلوبہ فیلڈ غائبپے لوڈ کا جائزہ لیں

کارکردگی کے بہترین طریقے

بیچ آپریشن: انفرادی ریکارڈز کے لیے API کو کبھی بھی کال نہ کریں۔ فہرستوں کے ساتھ create_multi اور write استعمال کریں:

# Bad: loop with individual creates
for product in products:
    call_kw("product.template", "create", [product])

# Good: batch create
call_kw("product.template", "create", [products])

فیلڈ کا انتخاب: تمام فیلڈز کو بازیافت کرنے سے بچنے کے لیے ہمیشہ fields پیرامیٹر کی وضاحت کریں:

# Good: only fetch needed fields
orders = call_kw(
    "sale.order", "search_read",
    [[["state", "=", "sale"]]],
    {"fields": ["name", "amount_total"], "limit": 1000}
)

صفحہ بندی: بڑے ڈیٹا سیٹس کے لیے، limit اور offset کا استعمال کرتے ہوئے صفحہ بندی کریں:

def fetch_all_records(model, domain, fields, batch_size=500):
    records = []
    offset = 0
    while True:
        batch = call_kw(
            model, "search_read", [domain],
            {"fields": fields, "limit": batch_size, "offset": offset}
        )
        records.extend(batch)
        if len(batch) < batch_size:
            break
        offset += batch_size
    return records

اکثر پوچھے گئے سوالات

Odoo 19 میں JSON-RPC اور REST API میں کیا فرق ہے؟

JSON-RPC تمام سرور سائیڈ طریقوں سمیت مکمل Odoo Python API تک رسائی فراہم کرتا ہے، جبکہ REST OpenAPI 3.0 کنونشنز کی پیروی کرتا ہے اور ایک زیادہ محدود لیکن معیاری انٹرفیس کو سامنے لاتا ہے۔ نئے انضمام کے لیے جہاں REST آپ کے استعمال کے معاملے کا احاطہ کرتا ہے، REST کو اس کی دریافت کے لیے ترجیح دی جاتی ہے۔ پیچیدہ ورک فلو آٹومیشن یا Python کے حسب ضرورت طریقوں تک رسائی کے لیے، JSON-RPC استعمال کریں۔

میں بڑے ڈیٹا ایکسپورٹ (100k+ ریکارڈز) کو مؤثر طریقے سے کیسے ہینڈل کروں؟

search_read اور 500–1000 ریکارڈز کے بیچ سائز کے ساتھ صفحہ بندی کا استعمال کریں۔ بہت بڑی برآمدات کے لیے، ایک بار نکالنے کے لیے UI کے ذریعے Odoo کی ایکسپورٹ فیچر کو استعمال کرنے پر غور کریں، یا Odoo کے ir.cron ماڈل کا استعمال کرتے ہوئے بیک گراؤنڈ جابز کو ریئل ٹائم API کالز کرنے کے بجائے آف پیک اوقات کے دوران ٹکڑوں میں ڈیٹا پر کارروائی کرنے کے لیے شیڈول کریں۔

کیا میں XML-RPC کے لیے صارف نام/پاس ورڈ کی بجائے API کیز استعمال کر سکتا ہوں؟

جی ہاں Odoo 13+ میں، API کیز کو XML-RPC توثیق کال میں پاس ورڈ کے طور پر استعمال کیا جا سکتا ہے۔ اپنے صارف پروفائل سے ایک API کلید بنائیں اور اسے اپنے پاس ورڈ کی جگہ استعمال کریں: common.authenticate(db, username, api_key, {})۔ سروس اکاؤنٹس کے لیے یہ تجویز کردہ طریقہ ہے۔

میں API کے ذریعے Many2many اور One2many ریکارڈ کیسے بناؤں؟

Odoo کے کمانڈ ٹیپلز کا استعمال کریں: (0, 0, vals) ایک نیا متعلقہ ریکارڈ بناتا ہے، (1, id, vals) ایک موجودہ متعلقہ ریکارڈ کو اپ ڈیٹ کرتا ہے، (2, id, 0) ایک متعلقہ ریکارڈ کو حذف کرتا ہے، (4, id, 0) ایک موجودہ ریکارڈ کو جوڑتا ہے، (5, 0, 0) تمام متعلقہ ریکارڈ کو غیر لنک کرتا ہے۔ یہ کمانڈ JSON-RPC، XML-RPC، اور REST میں یکساں طور پر کام کرتے ہیں۔

میں API کے ذریعے ورک فلو ایکشن (جیسے آرڈر کی تصدیق) کو کیسے متحرک کروں؟

ماڈل پر متعلقہ طریقہ کو کال کریں۔ سیلز آرڈر کی تصدیق کے لیے، action_confirm کو sale.order پر کال کریں۔ ڈیلیوری کی توثیق کے لیے، button_validate کو stock.picking پر کال کریں۔ یہ طریقے Odoo کے سورس کوڈ میں نظر آتے ہیں اور UI کے ڈویلپر موڈ میں بٹن کے name انتساب کا معائنہ کر کے دریافت کیا جا سکتا ہے۔

Odoo API کالز پر شرح کی کیا حدیں لگاتا ہے؟

Odoo اطلاق کی سطح پر مقامی طور پر API کی شرح کی حدود کو نافذ نہیں کرتا ہے۔ شرح کی حد کو ریورس پراکسی (Nginx) یا بنیادی ڈھانچے کی سطح پر ترتیب دیا جانا چاہیے۔ ایک سمجھدار ڈیفالٹ بیرونی انضمام کے لیے فی منٹ 60 درخواستیں ہیں۔ ہائی تھرو پٹ انضمام کے لیے، ایک وقف سروس صارف کے ساتھ قطار پر مبنی طریقہ استعمال کریں۔


اگلے اقدامات

ایک قابل اعتماد Odoo API انضمام کی تعمیر کے لیے ورکنگ کوڈ کی مثالوں سے زیادہ کی ضرورت ہوتی ہے — یہ Odoo کے ڈیٹا ماڈل کے ساتھ درست غلطی سے نمٹنے، نگرانی، اسناد کے انتظام اور صف بندی کا مطالبہ کرتا ہے۔

ECOSIRE کی انٹیگریشن ٹیم نے Odoo اور درجنوں پلیٹ فارمز بشمول Shopify، Amazon، GoHighLevel، Power BI، کسٹم ERPs، اور ملکیتی نظام کے درمیان پروڈکشن گریڈ کنکشن بنائے ہیں۔ ہم تصدیقی فن تعمیر، ویب ہک ڈیزائن، ڈیٹا کی تبدیلی، اور جاری نگرانی کو سنبھالتے ہیں۔

اپنے Odoo انٹیگریشن پروجیکٹ کے بارے میں ECOSIRE سے بات کریں →

چاہے آپ ایک نیا انضمام شروع کر رہے ہوں یا ٹوٹے ہوئے کو ٹھیک کر رہے ہوں، ہمارے انجینئرز آپ کی ضروریات کا جائزہ لیں گے اور ایک ایسا حل پیش کریں گے جو پہلے دن سے ہی اہم معاملات کو سنبھالے گا۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp