У меня есть 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();
Есть идеи, что я могу сделать, чтобы это работало?
Вы должны преобразовать 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);
Проблема в том, что ваш объект 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. (это то, что я подозреваю, что ваш бэкэнд ожидает)
request_data_jsn
. Кроме того, «application / json» - это правильный заголовок типа контента, если вы отправляете json - но то, что вы отправляете в своем примере кода, это НЕ json (json - текстовый формат), это объект javascript.