IBM Watson неправильно анализирует полезную нагрузку json из запросов python (400) - PullRequest
1 голос
/ 11 июля 2019

Я хочу сделать вызов 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)

Ответ, который я получаю от Уотсона:

{ "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?

Ответы [ 4 ]

3 голосов
/ 11 июля 2019

Эта 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.

2 голосов
/ 11 июля 2019

Используйте параметр json= для POST JSON с запросами.

Он автоматически закодирует ваши данные и добавит заголовок 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)
1 голос
/ 13 июля 2019

Почему бы не использовать Watson Python SDK?

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

Он обработает все эти мелкие детали для вас.

1 голос
/ 11 июля 2019
>>> data = { "input" : {"text" :"my message"} }
>>> data
{'input': {'text': 'my message'}}
>>> type(data)
<class 'dict'>

Вот что дает мне оболочка python из вашего кода относительно переменной с именем data.

Возможно, вам нужна строка, а не словарь.

>>> myvar = '{ "input" : {"text" :"my message"} }'
>>> myvar
'{ "input" : {"text" :"my message"} }'
>>> type(myvar)
<class 'str'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...