Как передать кириллицу с помощью POST-запроса с колбой - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть такой маршрут:

@app.route('/wikidata/api/v1.0/ask', methods=['POST'])
def get_tasks():

    print(request.data)
    print(request.json)
    return jsonify(1)

Я отправляю запрос:

curl -i -H "Content-Type:application/json" -X POST -d "{\"название\": \"значение?\",\"param1\": \"Q29424\"}" http://localhost:8529/wikidata/api/v1.0/ask

и получаю ошибку:

HTTP/1.0 400 BAD REQUEST
Content-Type: text/html
Content-Length: 223
Server: Werkzeug/0.14.1 Python/3.6.5
Date: Fri, 15 Feb 2019 08:34:27 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Failed to decode JSON object: 'utf-8' codec can't decode byte 0xed in position 2: invalid continuation byte</p>

Между тем print(request.data)показывает, что request.data это b'{"\xed\xe0\xe7\xe2\xe0\xed\xe8\xe5": "\xe7\xed\xe0\xf7\xe5\xed\xe8\xe5?","param1": "Q29424"}'

Единственное, что помогло до сих пор, это

decoded_data = request.data.decode('windows-1251')
question = json.loads(decoded_data)

Я ищу способ правильно отправить запрос (или настроить сервер) так, чтобыЯ могу использовать request.json без ошибок.

Спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Это специфическая проблема Windows, вероятно, из-за кодировки по умолчанию в командной строке Windows.Символы кириллицы в вашей командной строке неверно интерпретируются с помощью кодировки, не совместимой с UTF-8.

Поскольку вы уже используете Python, самый простой способ IMHO отправить запрос - использовать модуль requests (который вы можетеустановить используя pip install requests).Затем введите эту команду в файле Python, используя UTF-8 в качестве charset:

import requests
requests.post("http://localhost:8529/wikidata/api/v1.0/ask", json={"название": "значение?","param1": "Q29424"})

Запустите ее, и она будет иметь тот же эффект, что и ваша командная строка curl, только с правильной обработкой кириллических символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...