IBM Watson 未正确解析来自 python 请求的 json 负载 (400)

IBM Watson does not parse json payload from python requests correctly (400)

我想对以下端点进行 API 调用 https://cloud.ibm.com/apidocs/assistant-v2#send-user-input-to-assistant

我的代码如下所示:

session = requests.Session()
session.auth = (WATSON_USERNAME, WATSON_PASSWORD)
data = { "input" : {"text" :"my message"} }
response = session.post(
    f'{WATSON_ENDPOINT}/{session_id}/message?{WATSON_API_VER}', 
    headers={"Content-Type": "application/json"},
    data=data)

我从 watson 得到的响应是

{ "error": "Unexpected token i in JSON at position 0", "code":400 }

如果我把data改成{ "X" : {"text" :"my message"} }

{ "error": "Unexpected token X in JSON at position 0", "code":400 }

知道为什么我的 data 负载无法像 API 提供的示例那样被解析吗?

>>> data = { "input" : {"text" :"my message"} }
>>> data
{'input': {'text': 'my message'}}
>>> type(data)
<class 'dict'>

这是 python shell 从你的代码中得到的关于名为 data 的变量的内容。

虽然您可能需要一个字符串,而不是字典。

>>> myvar = '{ "input" : {"text" :"my message"} }'
>>> myvar
'{ "input" : {"text" :"my message"} }'
>>> type(myvar)
<class 'str'>

您发送的 data 有效负载是 Python dictRequests 将编码为 POST 数据

data = { "input" : {"text" :"my message"} }

与您交谈的 API 需要 JSON 数据

import data
data = json.dumps(data)

看起来你从侧边栏构建了示例

curl -u "apikey:{apikey}" -X POST -H "Content-Type:application/json" -d "{\"input\": {\"text\": \"Hello\"}}" "https://gateway.watsonplatform.net/assistant/api/v2/assistants/{assistant_id}/sessions/{session_id}/message?version=2019-02-28"

发送到curl的数据是JSON编码的字符串。

如果你回到那个例子 url,有一个下拉菜单告诉你如何在 Python 中使用 ibm_watson 包发出请求。

使用 json= 参数对 POST 一个 JSON 请求。

它将自动对您的数据进行编码并添加 Content-Type: application/json header.

import requests

session = requests.Session()
session.auth = (WATSON_USERNAME, WATSON_PASSWORD)

data = {"input": {"text": "my message"}}
url = f'{WATSON_ENDPOINT}/{session_id}/message?{WATSON_API_VER}'

response = session.post(url, json=data)
print(response.status_code, response.text)

为什么不使用 Watson Python SDK?

https://github.com/watson-developer-cloud/python-sdk

它将为您处理所有这些琐碎的细节。