IBM Watson无法正确解析python请求中的json负载(400)

时间:2019-07-11 16:31:54

标签: python http python-requests ibm-watson

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

我的代码如下:

public override void OnBackPressed()
{
    base.OnBackPressed();
}

我从沃森得到的答复是

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)

如果我将{ "error": "Unexpected token i in JSON at position 0", "code":400 } 更改为data

{ "X" : {"text" :"my message"} }

关于为什么无法像API提供的示例那样解析我的{ "error": "Unexpected token X in JSON at position 0", "code":400 } 有效载荷的任何想法?

4 个答案:

答案 0 :(得分:3)

您要发送的这个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字符串。

如果您返回该示例网址,则会出现一个下拉列表,其中显示了如何使用Python软件包在ibm_watson中进行请求。

答案 1 :(得分:2)

使用json=参数对带有请求的JSON POST

它将自动编码您的数据并添加Content-Type: application/json标头。

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)

答案 2 :(得分:1)

>>> 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'>

答案 3 :(得分:1)

为什么不使用Watson Python SDK?

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

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