POST / HTTP/1.1
Host: example.com
Accept: */*
Content-Length: 264
Content-Type: application/x-www-form-urlencoded
User-Agent: Arma Reforger/1.1.0.42 (Headless; Windows)
{"token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","events":[{"name":"serveradmintools_conflict_base_captured","title":"Base André's Beacon captured by Soviet Army","data":{"faction":"Soviet Army","base":"André's Beacon"},"timestamp":1716526768}]}
Я использую Postman для имитации этих запросов с использованием тех же заголовков HTTP, поскольку я тестирую локально. Я пробовал анализировать эти запросы разными способами и не смог получить желаемые результаты. Два ближайших решения, которые я нашел, следующие:
1.) Первая попытка использовать request.get_data() и снять кавычки:
from flask import Flask, request
from urllib.parse import unquote
app = Flask(__name__)
@app.route('/', methods=['POST'])
def events():
requestData = request.get_data()
eventData = unquote(requestData) # works but replaces first colon with equals sign?
return eventData
if __name__ == '__main__':
app.run(debug=True)
Результаты, которые я вижу в Postman, выглядят следующим образом (обратите внимание, как первое двоеточие в строке JSON заменяется знаком равенства. Я не могу понять, почему это происходит для жизнь моя):
{"token"="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","events":[{"name":"serveradmintools_conflict_base_captured","title":"Base André's Beacon captured by Soviet Army","data":{"faction":"Soviet Army","base":"André's Beacon"},"timestamp":1716526768}]}
2.) Вторая попытка использования request.form:
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def events():
eventData = request.form
return eventData
if __name__ == '__main__':
app.run(debug=True)
Но результаты в Postman выглядят следующим образом (обратите внимание на дополнительные экранированные двойные кавычки и некоторые символы, отображаемые неправильно). Мне удалось исправить проблему с отображением символов, и я мог бы использовать регулярное выражение или замену строки, чтобы удалить лишние экранированные двойные кавычки, но почему они там вообще и есть ли лучший способ сделать это?) :
{
"{\"token\"": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"events\":[{\"name\":\"serveradmintools_conflict_base_captured\",\"title\":\"Base Andr\u00e9's Beacon captured by Soviet Army\",\"data\":{\"faction\":\"Soviet Army\",\"base\":\"Andr\u00e9's Beacon\"},\"timestamp\":1716526768}]}"
}
Я просто хочу проанализировать отправленные данные POST как JSON, чтобы затем вставить их в базу данных. Как мне это сделать правильно? Я пробовал такие вещи, как request.get_json(force=True) и json.loads(), но он терпит неудачу с ошибками о недопустимом JSON (хотя запуск строки JSON через валидатор говорит, что она действительна).
Вот скриншоты заголовков и тела запроса в Postman:
Тело POST-запроса в Postman
Заголовки HTTP-запроса в Postman
Любая помощь приветствуется!
Обновление: я не могу понять, почему json не анализируется правильно, но я только что добавил дополнительный код для проверки и замены случайного знака равенства двоеточием. , который фиксирует, что строка является допустимой в формате JSON. Ниже приведен код моего решения. Я все еще не считаю, что это лучший способ, но пока я не найду лучшее решение...
from urllib.parse import unquote
app = Flask(__name__)
@app.route('/', methods=['POST'])
def events():
requestData = unquote(request.get_data())
eventData = requestData
# check for equals sign in first 10 chars, replace it with colon:
firstChars = eventData[:10]
if '=' in firstChars:
eventDataJson = eventData.replace('=',':')
return eventDataJson
if __name__ == '__main__':
app.run(debug=True)```
Подробнее здесь: https://stackoverflow.com/questions/785 ... -json-body