Web2py:通过 Web2py 调度程序中的 Rest API post 调用发送 JSON 数据
Web2py: Sending JSON Data via a Rest API post call in Web2py scheduler
我有一个表单,其中一个字段的类型是 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)
当用户提交这个表单时,这个数据也同时插入到另一个table。
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 请求)执行相同的请求,我会得到想要的结果。
当我尝试从 table.
中获取数据类型时,数据类型有什么问题吗?power_response = requests.post(vm_power_op_url, json=vm_power_opStatus_row_data)
看来 vm_power_opStatus_row_data
已经是 JSON 编码的字符串。但是,requests.post()
的 json
参数应该是 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
.