如何处理来自其他应用或服务的请求,或获取其数据
你可以通过向应用发送带有 “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!')
某个虚拟表的客户端模块(包含 request、endpoint 和 value 字段):
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。