Python API, потребляемый JavaScript, отправляющий данные JSON

1

У меня есть REST API с Python, и я хочу использовать его через JavaScript. API необходимо отправить некоторые данные из внешнего интерфейса в виде JSON, поэтому я выполняю вызов следующим образом:

var xhttp = new XMLHttpRequest(),
    dataToSend = '{"key":"value"}';

xhttp.onreadystatechange = function() {
    // Some logic.....
};

xhttp.open("POST", "URL to the API", true);
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(dataToSend);

С сервера я получаю 500 с этим в качестве причины:

"TypeError: объект JSON должен быть str, а не 'dict" "

Я попытался изменить тип MIME на "text/plain", "text/html" и несколько других, но он просто изменил ответ на:

TypeError: объект JSON должен быть str, а не NoneType

Бэк-энды сказали, что API работает нормально, и что они протестировали его с помощью следующего кода Python

request_result = requests.post('API URL', json=request_data_jsn).json();

Есть идеи, что я могу сделать, чтобы это работало?

  • 0
    «следующий код Python» не имеет смысла, если мы не знаем точно, что такое request_data_jsn . Кроме того, «application / json» - это правильный заголовок типа контента, если вы отправляете json - но то, что вы отправляете в своем примере кода, это НЕ json (json - текстовый формат), это объект javascript.
  • 0
    О коде Python, извините, это все, что мне удалось получить от них. Что касается объекта, то он на самом деле является допустимой строкой JSON, в нем есть все кавычки и все. Я также проверяю это с jsonlint.com, чтобы убедиться, что это правильный формат
Показать ещё 1 комментарий

2 ответа

2

Вы должны преобразовать dataToSend в строку. Пример: использование JSON.stringify

var xhttp = new XMLHttpRequest(),
    dataToSend = {"key":"value"}

xhttp.onreadystatechange = function(data) {
    console.log(data);
};

dataToSend = JSON.stringify(dataToSend);
xhttp.open("POST", "URL to the API", true)
xhttp.setRequestHeader("Content-type", "application/json")
xhttp.send(dataToSend);
  • 0
    Извините, я не написал свой вопрос правильно, я действительно сделал это (я только отредактировал мой вопрос)
  • 0
    Я попробовал ваш код: dataToSend = '{"key": "value"}'. Это успех. Можете ли вы поставить код Python API?
-2

Проблема в том, что ваш объект dataToSend был определен как сам словарь. Вам нужно преобразовать его в формат JSON, прежде чем вызывать его в API. Вы можете сделать это следующим образом:

var xhttp = new XMLHttpRequest(),
    dataToSend = {"key":"value"};

xhttp.onreadystatechange = function() {
    // Some logic.....
};

dataToSend = JSON.stringify(dataToSend)
xhttp.open("POST", "URL to the API", true);
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(dataToSend);

то, что это делает, - то, что это преобразовывает объект в строку JSON. (это то, что я подозреваю, что ваш бэкэнд ожидает)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню