如何使硬编码的 HTTP 处理脚本动态化?
How to make a hard-coded HTTP processing script dynamic?
我有一个 Jython 2.7 脚本,它接收 URL 并使用 URL 中的 parameters/values 创建或更新记录。
- 示例 URL:
http://server:host/maximo/oslc/script/CREATEWO?&wonum=WO0001&description=Legacy&classstructureid=1666&wopriority=1&worktype=CM
详情:
- 接收URL并将parameters/values放入变量中:
from psdi.server import MXServer
from psdi.mbo import MboSet
resp = {}
wonum = request.getQueryParam("wonum")
description = request.getQueryParam("description")
classstructureid = request.getQueryParam("classstructureid")
wopriority = request.getQueryParam("wopriority")
worktype = request.getQueryParam("worktype")
- 一些与问题无关的行:
woset = MXServer.getMXServer().getMboSet("workorder",request.getUserInfo())
whereClause = "wonum= '" + wonum + "'"
woset.setWhere(whereClause)
woset.reset()
woMbo = woset.moveFirst()
- 然后使用这些值创建新记录或更新现有记录:
#If workorder already exists, update it:
if woMbo is not None:
woMbo.setValue("description", description)
woMbo.setValue("classstructureid", classstructureid)
woMbo.setValue("wopriority", wopriority)
woMbo.setValue("worktype", worktype)
woset.save()
woset.clear()
woset.close()
resp[0]='Updated workorder ' + wonum
#Else, create a new workorder
else:
woMbo=woset.add()
woMbo.setValue("wonum",wonum)
woMbo.setValue("description", description)
woMbo.setValue("classstructureid", classstructureid)
woMbo.setValue("wopriority", wopriority)
woMbo.setValue("worktype", worktype)
woset.save()
woset.clear()
woset.close()
resp[0]='Created workorder ' + wonum
responseBody =resp[0]
问题:
不幸的是,字段 names/values 在脚本的 3 个不同位置 被硬编码。
我想增强脚本,使其成为动态的 -- 而不是硬编码的。
- 换句话说,如果脚本可以接受 parameters/values 的列表并简单地遍历它们以在各自的字段中更新或创建记录,那就太好了。
可以这样做吗?
假设您始终使用相同的查询参数,而不是定义变量,遍历字符串列表并将它们作为键值对
填充
items = ["wonum", "description"]
resp = {k: request.getQueryParam(k) for k in items}
然后设置
for i in items:
woMbo.setValue(i, resp[i])
否则,你正在寻找 URL parsing
和 getQuery
方法,然后是 split("=")
,给你 ["wonum", "WO0001", "description", "Legacy"]
,例如,你可以循环为您提供动态条目的所有其他元素
l = ["wonum", "WO0001", "description", "Legacy"]
for i in range(0, len(l)-1, 2):
print(f'key:{l[i]}\tvalue:{l[i+1]}')
key:wonum value:WO0001
key:description value:Legacy
注意:这会受到 SQL 注入攻击,应该修复
whereClause = "wonum= '" + wonum + "'"
您正在使用 Maximo Next Gen.REST API 来执行自动化脚本,该脚本接受带参数的 HTTP 请求并在系统中创建或更新工单。您想使您的脚本更通用(大概是为了 created/updated 工单接受更多参数)and/or 其他 mbo。
这无需开发自动化脚本,只需使用 Next Gen 即可实现。API您已经在使用它来执行脚本。 API 已经接受对 mxwo 对象结构的创建和更新请求,能够使用所有字段、子对象等。
我有一个 Jython 2.7 脚本,它接收 URL 并使用 URL 中的 parameters/values 创建或更新记录。
- 示例 URL:
http://server:host/maximo/oslc/script/CREATEWO?&wonum=WO0001&description=Legacy&classstructureid=1666&wopriority=1&worktype=CM
详情:
- 接收URL并将parameters/values放入变量中:
from psdi.server import MXServer from psdi.mbo import MboSet resp = {} wonum = request.getQueryParam("wonum") description = request.getQueryParam("description") classstructureid = request.getQueryParam("classstructureid") wopriority = request.getQueryParam("wopriority") worktype = request.getQueryParam("worktype")
- 一些与问题无关的行:
woset = MXServer.getMXServer().getMboSet("workorder",request.getUserInfo()) whereClause = "wonum= '" + wonum + "'" woset.setWhere(whereClause) woset.reset() woMbo = woset.moveFirst()
- 然后使用这些值创建新记录或更新现有记录:
#If workorder already exists, update it: if woMbo is not None: woMbo.setValue("description", description) woMbo.setValue("classstructureid", classstructureid) woMbo.setValue("wopriority", wopriority) woMbo.setValue("worktype", worktype) woset.save() woset.clear() woset.close() resp[0]='Updated workorder ' + wonum #Else, create a new workorder else: woMbo=woset.add() woMbo.setValue("wonum",wonum) woMbo.setValue("description", description) woMbo.setValue("classstructureid", classstructureid) woMbo.setValue("wopriority", wopriority) woMbo.setValue("worktype", worktype) woset.save() woset.clear() woset.close() resp[0]='Created workorder ' + wonum responseBody =resp[0]
问题:
不幸的是,字段 names/values 在脚本的 3 个不同位置 被硬编码。
我想增强脚本,使其成为动态的 -- 而不是硬编码的。
- 换句话说,如果脚本可以接受 parameters/values 的列表并简单地遍历它们以在各自的字段中更新或创建记录,那就太好了。
可以这样做吗?
假设您始终使用相同的查询参数,而不是定义变量,遍历字符串列表并将它们作为键值对
填充
items = ["wonum", "description"]
resp = {k: request.getQueryParam(k) for k in items}
然后设置
for i in items:
woMbo.setValue(i, resp[i])
否则,你正在寻找 URL parsing
和 getQuery
方法,然后是 split("=")
,给你 ["wonum", "WO0001", "description", "Legacy"]
,例如,你可以循环为您提供动态条目的所有其他元素
l = ["wonum", "WO0001", "description", "Legacy"]
for i in range(0, len(l)-1, 2):
print(f'key:{l[i]}\tvalue:{l[i+1]}')
key:wonum value:WO0001
key:description value:Legacy
注意:这会受到 SQL 注入攻击,应该修复
whereClause = "wonum= '" + wonum + "'"
您正在使用 Maximo Next Gen.REST API 来执行自动化脚本,该脚本接受带参数的 HTTP 请求并在系统中创建或更新工单。您想使您的脚本更通用(大概是为了 created/updated 工单接受更多参数)and/or 其他 mbo。
这无需开发自动化脚本,只需使用 Next Gen 即可实现。API您已经在使用它来执行脚本。 API 已经接受对 mxwo 对象结构的创建和更新请求,能够使用所有字段、子对象等。