#javascript #api #curl #fetch
Вопрос:
Я получаю ошибку при выполнении запроса на извлечение, команда curl работает нормально, что
curl https://quizapi.io/api/v1/questions -G
-d apiKey=my_key
но когда я выполняю запрос javascript
fetch("https://quizapi.io/api/v1/questions", {
body: "apiKey=my_key",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST"
})
.then((res) => res.json())
.then((data) => {
console.log(data);
});
Я получаю сообщение об ошибке
Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
Редактировать
fetch('https://quizapi.io/api/v1/questions', {
headers: {
'X-Api-Key': `${apiKey}`,
},
})
.then((res) => res.json())
.then((data) => {
console.log(data);
});
Комментарии:
1. Возможно, есть больше кода JS, чем вы показываете? Где вы обрабатываете ответ? Если вы пытаетесь использовать
response.json()
, подтвердили ли вы, что API действительно отвечает с помощью JSON, а не HTML? Вы проверилиresponse.ok
, чтобы убедиться, что запрос был успешным?2. Я обновил код, пожалуйста, проверьте его
3. Если вы запускаете это в браузере, проверьте сетевую панель инструментов разработчика. API, похоже, отвечает с помощью HTML вместо JSON. Вероятно, в ответе сообщается об ошибке
4. Да, ответ на него
woops something went wrong
(у меня возникли проблемы с API! не в том, чтобы сделать запрос)
Ответ №1:
Вы получаете HTML-ответ (вероятно, ошибка 401). Согласно документам API, вам необходимо передать маркер аутентификации в качестве apiKey
параметра или заголовка запроса X-Api-Key
.
-G
Флаг in curl
делает его запросом GET и передает любые параметры данных ( -d
) в строку запроса. Вот тут-то ты и ошибаешься.
Вы отправляете запрос POST через fetch()
и пытаетесь отправить учетные данные в теле запроса. Это не сработает.
Попробуйте вместо этого сделать запрос GET и передать учетные данные в заголовке
fetch("https://quizapi.io/api/v1/questions", {
headers: {
"X-Api-Key": apiKey
},
// the default method is "GET"
}).then(res => {
if (!res.ok) {
throw new Error(res)
}
return res.json()
}).then(console.log).catch(console.error)
Альтернативой является включение apiKey
в строку запроса
const params = new URLSearchParams({ apiKey })
fetch(`https://quizapi.io/api/v1/questions?${params}`)