【问题标题】:Web2py: Sending JSON Data via a Rest API post call in Web2py schedulerWeb2py:通过 Web2py 调度程序中的 Rest API 发布调用发送 JSON 数据
【发布时间】:2018-06-10 21:28:09
【问题描述】:

我有一个表单,其中一个字段是 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)

当用户提交这个Form时,这个数据也同时插入到另一个表中。

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 请求)发出相同的请求,我会得到想要的结果。

当我尝试从表中获取数据类型时,数据类型有什么问题吗?

【问题讨论】:

    标签: python-requests web2py web2py-modules


    【解决方案1】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多