3

我向 RASA 聊天机器人发送了一个 POST 命令,其中包含一条消息。我的请求看起来像这样

import requests
import json
jsonbody = '{"message": "Wann ist der nächste Feiertag?"}'
r = requests.post('http://localhost:5005/webhooks/rest/webhook', data=jsonbody,
                              headers={'content-type': 'application/json'})
js = r.text
rep = json.loads(js)

raise JSONDecodeError("Expecting value", s, err.value) from None在跑步时得到rep = json.loads(js)

经过进一步调查,我发现我Response 400从 POST 请求中得到了一个。

我尝试了几件事,例如我将德语更改äae. 这很完美。打印 js 字符串后,print(js)我得到以下机器人响应

'[{"recipient_id":"default","text":"Der n\\u00e4chste Feiertag ist Tag der Deutschen Einheit am Donnerstag den 03.10.2019"}]'

打印列表后,print(rep)我收到了最后一条消息。

[{'recipient_id': 'default',
  'text': 'Der nächste Feiertag ist Tag der Deutschen Einheit am Donnerstag den 03.10.2019'}]

所以这里的问题是我的jsonbody中的德语变音符号。尽管在我发送请求ae而不是ä最后,它们显示为正确的。我已经尝试像这样在我的请求中设置一个字符集

r = requests.post('http://localhost:5005/webhooks/rest/webhook', data=jsonbody,
                              headers={'content-type': 'application/json; charset=unicode'})

但执行后我再次收到 Response 400 错误。

我将 conda 4.6.2 与 Python 3.6.6 一起使用。我认为 Python 3 可以处理像德语变音符号这样的特殊字符。

有什么建议可以在 POST 请求中允许德语变音符号吗?

4

2 回答 2

3

我一直在努力解决这个问题,但是在通过请求发送数据之前设置编码解决了这个问题:

jsonbody=jsonbody.encode()

在我的例子中,编码是 utf-8,这个函数 encode() 的默认值。

于 2019-11-21T23:43:58.873 回答
2
jsonbody = '{"message": "Wann ist der nächste Feiertag?"}'

我怀疑接受你请求的服务器不知道如何解析这个字符串。尽管我确实认为您的字符串是有效的 JSON(因为https://www.json.org/表示字符串可能包含 Unicode 字符),但服务器的 JSON 解析器可能只接受 ASCII 数据。\uXXXX如果您使用 JSON 的unicode 转义序列对 ä 进行编码,您可能会有更好的运气。您可以使用json.dumps转义数据中的所有非 ASCII 字符。

jsonbody = json.dumps({"message": "Wann ist der nächste Feiertag?"})
于 2019-08-26T14:06:34.447 回答