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 dict
,Requests
将编码为 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
它将为您处理所有这些琐碎的细节。
我想对以下端点进行 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 dict
,Requests
将编码为 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
它将为您处理所有这些琐碎的细节。