Python API 调用中的动态负载

Dynamic payload in Python API Call

背景: 我正在尝试进行 API 调用,其中必须包含有效负载。有效负载包含 2 个日期密钥对值,这些值以前是固定值,我试图将其动态化,因此它们始终是当前日期。

代码: 这是我的代码,它试图使 start_dateend_date 值动态化:

def job_initializer():
    key, secret, url = ini_reader()
     
    start_date = dt.datetime.today().strftime("%Y-%m-%d")
    end_date = dt.datetime.today().strftime("%Y-%m-%d")
    payload ="""
    
    {
      "data":{
        "type":"jobs",
        "attributes":{
          "job_type":"portfolio_view_results",
          "parameters":{
            "view_id":"304078",
            "portfolio_type":"firm",
            "portfolio_id":"1",
            "output_type":"json",
            "start_date":"%s",
            "end_date":"%s"
          }
        }
      }
    }
    """ %(start_date, end_date)
    d = {'payload': payload}
    payload = json.dumps(d)
    
    headers = {"Accept": "application/vnd.api+json", "Content-Type": "application/vnd.api+json", "firm": "381"}

    response = requests.post(url, auth=HTTPBasicAuth(key, secret), headers=headers, json=payload)
    print(response)
    return(response.json())
job_initializer()

问题: 如果我硬编码日期值(例如 "start_date": "2021-01-01"),我的代码/API 调用工作正常,但是,当我尝试使价值动态我得到一个 -

<Response [400]>
{'errors': [{'status': '400',
   'title': 'Bad Request',
   'detail': 'Missing data field'}]}

观察: 我尝试通过 print(payload) 进行调试,我注意到动态标签正在工作,但是格式看起来有点不对劲,这可能是原因对于这个问题。只是说出来,以防它有助于帮助我解决问题

{"payload": "\n    \n    {\n      \"data\":{\n        \"type\":\"jobs\",\n        \"attributes\":{\n          \"job_type\":\"portfolio_view_results\",\n          \"parameters\":{\n            \"view_id\":\"304078\",\n            \"portfolio_type\":\"firm\",\n            \"portfolio_id\":\"1\",\n            \"output_type\":\"json\",\n            \"start_date\":\"2022-01-10\",\n            \"end_date\":\"2022-01-10\"\n          }\n        }\n      }\n    }\n    ", "variables": {}}

有人知道我的代码遗漏了什么吗?

不太明白你目前的问题是什么。您的代码似乎有效。您的问题是为什么会出现 400 错误?

由于缺少 data,我猜该请求不会占用您的负载。您可以尝试将 Content-Type 设置为 application/json 或将请求参数从 json 更改为 data.

示例:

r = requests.post(base_url, headers=headers, data=d)