如何使硬编码的HTTP处理脚本动态化?

2024-09-30 06:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Jython 2.7脚本,它接收URL并使用URL中的参数/值来创建或更新记录

  • 示例URL:http://server:host/maximo/oslc/script/CREATEWO?&wonum=WO0001&description=Legacy&classstructureid=1666&wopriority=1&worktype=CM

详情:

  1. 接收URL并将参数/值放入变量中:
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")
  1. 一些与问题无关的行:
woset = MXServer.getMXServer().getMboSet("workorder",request.getUserInfo())
whereClause = "wonum= '" + wonum + "'"

woset.setWhere(whereClause)
woset.reset()
woMbo = woset.moveFirst()
  1. 然后使用这些值创建新记录或更新现有记录:
#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]

问题:

不幸的是,字段名/值在脚本中的3个不同位置进行了硬编码

我想增强脚本,使其是动态的,而不是硬编码的

  • 换句话说,如果脚本能够接受一个参数/值列表,并简单地循环它们以更新或创建相应字段中的记录,那就太好了

有可能这样做吗


Tags: 脚本urlrequest记录descriptionrespsetvalueworkorder
2条回答

您正在使用Maximo Next Gen.REST API执行一个自动化脚本,该脚本接受带有参数的HTTP请求,并在系统中创建或更新工单。您希望使脚本更通用(假定为创建/更新的工单接受更多参数)和/或其他mbo

这可以在不开发自动化脚本的情况下实现,而只需使用您已经在使用的下一代API来执行脚本。API已经接受create&;更新mxwo对象结构上的请求,使其能够使用所有字段、子对象等

https://developer.ibm.com/static/site-id/155/maximodev/restguide/Maximo_Nextgen_REST_API.html#_creating_and_updating_resources

假设您总是使用相同的查询参数,而不是定义变量,循环遍历字符串列表并将它们作为键值对

填充

items = ["wonum", "description"]
resp = {k: request.getQueryParam(k) for k in items}

然后设置

for i in items:
    woMbo.setValue(i, resp[i])

否则,您将寻找^{}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 + "'"

相关问题 更多 >

    热门问题