Web Services

Module web-service cung cấp một giao diện chung cho tất cả các web service:

  • XML-RPC

  • JSON-RPC

Các đối tượng nghiệp vụ (business object) cũng có thể được truy cập thông qua cơ chế đối tượng phân tán (distributed object). Tất cả chúng đều có thể được sửa đổi thông qua giao diện client với các view theo ngữ cảnh.

Odoo có thể được truy cập thông qua các giao diện XML-RPC/JSON-RPC, và đã có sẵn các thư viện cho nhiều ngôn ngữ lập trình khác nhau.

Thư viện XML-RPC

Ví dụ sau đây là một chương trình Python 3 tương tác với một server Odoo bằng thư viện xmlrpc.client:

import xmlrpc.client

root = 'http://%s:%d/xmlrpc/' % (HOST, PORT)

uid = xmlrpc.client.ServerProxy(root + 'common').login(DB, USER, PASS)
print("Logged in as %s (uid: %d)" % (USER, uid))

# Create a new note
sock = xmlrpc.client.ServerProxy(root + 'object')
args = {
    'color' : 8,
    'memo' : 'This is a note',
    'create_uid': uid,
}
note_id = sock.execute(DB, uid, PASS, 'note.note', 'create', args)

Exercise

Thêm một service mới vào client

Viết một chương trình Python có khả năng gửi các request XML-RPC đến một máy tính đang chạy Odoo (của bạn, hoặc của giảng viên của bạn). Chương trình này nên hiển thị tất cả các session và số lượng chỗ ngồi tương ứng của chúng. Nó cũng nên tạo một session mới cho một trong các khóa học.

Xem thêm

  • External API: Bài hướng dẫn chuyên sâu về XML-RPC, với các ví dụ trải rộng trên nhiều ngôn ngữ lập trình.

Thư viện JSON-RPC

Ví dụ sau đây là một chương trình Python 3 tương tác với một server Odoo bằng các thư viện Python chuẩn urllib.request và json. Ví dụ này giả định ứng dụng Productivity (note) đã được cài đặt:

import json
import random
import urllib.request

HOST = 'localhost'
PORT = 8069
DB = 'openacademy'
USER = 'admin'
PASS = 'admin'

def json_rpc(url, method, params):
    data = {
        "jsonrpc": "2.0",
        "method": method,
        "params": params,
        "id": random.randint(0, 1000000000),
    }
    req = urllib.request.Request(url=url, data=json.dumps(data).encode(), headers={
        "Content-Type":"application/json",
    })
    reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
    if reply.get("error"):
        raise Exception(reply["error"])
    return reply["result"]

def call(url, service, method, *args):
    return json_rpc(url, "call", {"service": service, "method": method, "args": args})

# log in the given database
url = "http://%s:%s/jsonrpc" % (HOST, PORT)
uid = call(url, "common", "login", DB, USER, PASS)

# create a new note
args = {
    'color': 8,
    'memo': 'This is another note',
    'create_uid': uid,
}
note_id = call(url, "object", "execute", DB, uid, PASS, 'note.note', 'create', args)

Các ví dụ có thể dễ dàng được điều chỉnh từ XML-RPC sang JSON-RPC.

Ghi chú

Có một số API cấp cao (high-level API) bằng nhiều ngôn ngữ khác nhau để truy cập hệ thống Odoo mà không cần tường minh đi qua XML-RPC hay JSON-RPC, chẳng hạn như: