Web2py: отправка данных JSON через пост-вызов API Rest в планировщике Web2py - PullRequest
0 голосов
/ 08 июня 2018

У меня есть форма, одно поле которой имеет тип IS_JSON

db.define_table('vmPowerOpsTable',
                Field('launchId',label=T('Launch ID'),default =datetime.datetime.now().strftime("%d%m%y%H%M%S")),
                Field('launchDate',label=T('Launched On'),default=datetime.datetime.now()),
                Field('launchBy',label=T('Launched By'),default = auth.user.email if auth.user else "Anonymous"),
                Field('inputJson','text',label=T('Input JSON*'),
                      requires = [IS_NOT_EMPTY(error_message='Input JSON is required'),IS_JSON(error_message='Invalid JSON')]),
                migrate=True)

Когда пользователь отправляет эту форму, эти данные также одновременно вставляются в другую таблицу.

db.opStatus.insert(launchId=vmops_launchid,launchDate=vmops_launchdate
                               ,launchBy=vmops_launchBy,opsType=operation_type,
                               opsData=vmops_inputJson,
                               statusDetail="Pending")
db.commit()

Теперь изпланировщик, я пытаюсь получить эти данные и сделать запрос POST.

vm_power_opStatus_row_data = vm_power_opStatus_row.opsData

Обратите внимание, на предыдущем шаге я могу получить данные.(Я вставил его в БД и увидел, что поле точно соответствует тому, что ввел пользователь.

Затем из планировщика я выполняю POST.

power_response = requests.post(vm_power_op_url, json=vm_power_opStatus_row_data)

Запрос POST обрабатываетсяфункция в моем контроллере.

Функция контроллера:

@request.restful()
def vmPowerOperation():
    response.view = 'generic.json'
    si = None
    def POST(*args, **vars):
        jsonBody = request.vars
        print "Debug 1"+ str(jsonBody) ##-> Here it returns blank in jsonBody.

Но если я сделаю тот же запрос извне (клиент POSTMAN или даже запрос Python), я получу желаемый результат.

Что-то не так с типом данных, когда я пытаюсь извлечь его из таблицы.

1 Ответ

0 голосов
/ 08 июня 2018
power_response = requests.post(vm_power_op_url,
                               json=vm_power_opStatus_row_data)

Похоже, что vm_power_opStatus_row_data уже является строкой в ​​кодировке JSON.Однако аргумент json для requests.post() должен быть объектом Python, а не строкой (requests автоматически закодирует объект Python в JSON и соответствующим образом установит тип содержимого).Итак, вышеприведенное должно быть:

power_response = requests.post(vm_power_op_url,
                               json=json.loads(vm_power_opStatus_row_data))

В качестве альтернативы, вы можете использовать аргумент data и установить тип контента в JSON:

power_response = requests.post(vm_power_op_url,
                               data=vm_power_opStatus_row_data,
                               headers={'Content-Type': 'application/json')

Также обратите внимание, что в вашем RESTФункция POST, request.vars уже передана функции как **vars, поэтому внутри функции вы можете просто ссылаться на vars вместо request.vars.

...