Как сделать жестко запрограммированный скрипт обработки HTTP динамическим c? - PullRequest
1 голос
/ 19 июня 2020

У меня есть сценарий 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")
Некоторые строки, не относящиеся к вопросу:
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]

Вопрос:

К сожалению, имена / значения полей жестко запрограммированы в 3 разных местах в скрипте.

Я хотел бы улучшить скрипт, чтобы он является динамическим c - не запрограммировано жестко.

  • Другими словами, было бы здорово, если бы сценарий мог принимать список параметров / значений и просто l oop через них обновлять или создавать запись в соответствующие поля.

Можно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 22 июня 2020

Вы используете REST API Maximo Next Gen. для выполнения сценария автоматизации, который принимает HTTP-запрос с параметрами и создает или обновляет рабочее задание в системе. Вы хотите сделать ваш скрипт более универсальным c (предположительно, чтобы принять больше параметров для созданного / обновленного рабочего порядка) и / или других mbo.

Это может быть достигнуто без разработки скриптов автоматизации и просто с помощью Next Gen. API, который вы уже используете для выполнения скрипта. API уже принимает запросы на создание и обновление структуры объекта mxwo с возможностью использования всех полей, дочерних объектов и т. Д. c.

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

2 голосов
/ 19 июня 2020

Предполагая, что вы всегда работаете с одними и теми же параметрами запроса, а не определяете переменные, l oop через список строк и помещаете их как пары ключ-значение

Для заполнения

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 oop поверх любого другого элемента, чтобы получить динамику c записей

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 + "'"
...