如何处理来自其他应用或服务的请求,或获取其数据

你可以通过向应用发送带有 “ext” 的 post 请求来读写应用的数据。例如:

http://your_jampy_app.com/ext/something

当服务器上的 Web 应用收到这样的请求时,会触发 on_ext_request 事件。

例如,Jam.py 应用程序的表 account_transactions 有一个字段 actual_amount 。 应用程序的 Task 模块包含如下代码:

def on_ext_request(task, request, params):
    reqs = request.split('/')
    if reqs[2] == 'expenses':
        result = task.account_transactions.expenses(task, params)
        return result

account_transactions 的 Task 服务端模块包含:

from jam.common import cur_to_str

def expenses(item, params):
    inv = item.task.account_transactions.copy()
    inv.open()
    total = 0
    for i in inv:
        total += i.actual_amount.value

    total = cur_to_str(total)
    return(total)

使用 Curl 命令访问应用会返回如下结果:

...\> curl -k https://your_jampy_app.com/ext/expenses -d "[]" -H  "Content-Type: application/json"
{"result": {"status": 9, "data": "-$2590.01", "modification": 99}, "error": null}

Curl 传递变量

在 Demo 应用中,如果在 Task 服务端模块中添加如下代码:

def on_ext_request(task, request, params):
    print(request, params)
    reqs = request.split('/')
    if reqs[2] == 'bla':
        users = task.customers.copy(handlers=False)
        users.set_where(id=params['id'])
        users.open()
        if users.rec_count == 1:
                return {
                    'id': users.firstname.value,
                    'firstname': users.firstname.value,
                }

用 Curl 传递参数会返回如下结果:

...\> curl  http://localhost:8080/ext/bla -d '{"id": "2", "firstname": "Leonie"}' -H "Content-Type: application/json"
{"result": {"status": 9, "data": {"id": "Leonie", "firstname": "Leonie"}, "modification": 2014}, "error": null}

处理请求中的数据

上面同样的应用可以被其他 Jam.py 应用通过服务端模块访问:

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen
import json
import time

params = []

def api_fetch(url, request, params):
    try:
        a = urlopen(url + '/' + request, data=str.encode(json.dumps(params)))
        r = json.loads(a.read().decode())
        return r['result']['data']
    except:
        return False


def send(item):
    result= ''
    res = []
    request = 'expenses';
    endpoint = 'https://your_jampy_app.com/ext';

    try:
        # print('Req: ' + request)
        result = api_fetch(endpoint, request, [])
    except:
        return False
    if result:
        # print(result)
        res.append(
            {
                # 'id': 1,
                'request': request,
                'endpoint': endpoint,
                'value': result,
            }
        )
        return res
    else:
        raise Exception('Could not connect!')

某个虚拟表的客户端模块(包含 requestendpointvalue 字段):

function on_view_form_created(item) {
    item.view_options.open_item = false;
    item.view_options.form_header = false;
    item.open({open_empty: true});
    item.paginate = false;
    item.view_form.find("#edit-btn").hide();
    item.view_form.find("#delete-btn").hide();
    item.view_form.find("#new-btn").hide();
    item.alert('Fetching!');
    item.server('send', function(records, err) {
        item.disable_controls();
        if (err) {
            item.warning('Failed to fetch data: ' + err);
        }
        else {
            if (records.length > 0) {
                records.forEach(function(rec) {
                    item.append();
                    // item.id.value = rec.id;
                    item.request.value = rec.request;
                    item.endpoint.value = rec.endpoint;
                    item.value.value = rec.value;
                    item.post();
                });
                item.first();
                item.enable_controls();
                item.alert('Successfully fetched from API!');
            }
        }
    });
}

最终结果会在表格中显示从 endpoint 获取的 value,以及对应的 request