Я получаю эту ошибку каждый раз, когда пытаюсь использовать метод POST в своем API.
SyntaxError: Unexpected end of JSON input at fetch.then.response
Когда я использую метод GET, я обычно получаю данные. Это код:
const teste = () => {
fetch("myURL/test", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
id: 1,
name: "Teste",
amount: 1,
value: 3
})
})
.then(response => response.json()) //Here is the error
.then(data => {
console.info(data);
})
.catch((err)=>console.info(err))}
Кто-нибудь может мне помочь? Спасибо.
Обновлено: Я просто добавляю эту строку, чтобы увидеть журнал:
.then(response => console.info(response))
Вот что я получил:
Response {
type: "cors",
url: "myURL/test",
redirected: false,
status: 201,
ok: true,
…}
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 201
statusText: ""
type: "cors"
: "myURL/test"
__proto__: Response
@Pointy Я просто получаю эту ошибку: SyntaxError: неожиданный конец ввода JSON в fetch.then.response
Что касается комментария @pointy, вы можете посмотреть, как выглядит ответ, заменив then(resp => resp.json()) на then(resp => resp.text()).then(console.info), и отредактировать свой ответ, включив записанный текст.
Или просто посмотрите в инструментах разработчика браузера вкладку "Сеть"
@NinoFiliu Я сделал то, что ты сказал.
Нет, это объект Response, я думаю, вы забыли resp => resp.text()



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это означает, что страница, полученная по адресу myURL/test, не отвечает содержимым JSON или с искаженным содержимым JSON. Это не ошибка вашего скрипта, все в порядке, это ошибка вашего сервера, который не обслуживает контент JSON в myURL/test.
Также обратите внимание, что серверы могут по-разному отвечать на запросы GET и POST для одного и того же URL-адреса! Если вы получаете действительный JSON из запроса GET, но, как вы описали, не можете получить действительный JSON из запроса POST, ваш сервер может обслуживать другой контент в зависимости от типа запроса. Исследуйте это.
then(resp => resp.json()) на then(resp => resp.text()).then(console.info), чтобы увидеть, как выглядит обслуживаемый контент.networkmyURL/testresponse: это будет текстовое содержимое. Он должен быть правильно отформатирован JSON.Инструменты разработчика браузера отобразят полный текст HTTP-запроса и ответа.
Конечно! Я отредактирую свой ответ, чтобы включить это. Я никогда не использовал инструменты разработчика как новичок, поэтому я думал только о том, чтобы предложить советы только по сценариям.
@NinoFiliu Когда я использую метод GET, я получаю следующее: [ { "id": 1, "name": "Coca-Cola", "amount": 1, "value": 2.5 } ]
Попробуйте опубликовать тело: { данные: { I'd: 1, имя: "test #"}}
@RicardoSanches, который вы получаете с помощью POST, но получаете действительный JSON только с помощью GET, поэтому ваш сервер обслуживает другой контент на основе POST/GET. Смотрите добавленный абзац в моем ответе.
В основном метод GET не отправляет ваш объект тела на сервер, на котором вы получаете ответ. Только действие POST отправит ваш объект body на сервер.
Я предполагаю, что объект, который вы хотите отправить, является проблемой. Либо сервер, к которому вы пытаетесь подключиться, не ожидает объект body в виде строки, либо вам следует убедиться, что вы правильно проанализировали JSON перед обработкой.
Я думаю, ты прав. Я использую SwaggerHub для создания API, и я думаю, что это может быть проблемой.
Похоже, API, который вы вызываете, не имеет тела ответа на этот конкретный POST. Затем, когда вы вызываете response.json() (преобразовывая response.body в json), возникает ошибка.
Или, может быть, ответ: тело не является допустимым телом json.
Если вы хотите обработать эту ошибку более модно, вы можете сделать это так:
tryGetJson = async (resp) => {
return new Promise((resolve) => {
if (resp) {
resp.json().then(json => resolve(json)).catch(() => resolve(null))
} else {
resolve(null)
}
})
}
https://github.com/github/fetch/issues/268#issuecomment-399497478
(для тех, кто придет позже, но решит эту проблему)
Проблема, скорее всего, в ошибке сервера или неверном URL-адресе, но вы этого не видите, потому что во всех примерах в Интернете, как работать с fetch, отсутствует одна важная часть - сбой сервера или сети.
Я думаю, что правильный способ справиться с fetch — это проверить ответ, если он содержит ошибки, перед преобразованием в json.
Проверьте часть первого then в примере, где it.ok тестируется:
async function fetchData() {
return await fetch('https://your-server.com/some-NOt-existing-url/')
.then(it => {
if (!it.ok) {
throw `Server error: [${it.status}] [${it.statusText}] [${it.url}]`;
}
return it.json();
})
.then(receivedJson => {
// your code with json here...
})
.catch(err => {
console.debug("Error in fetch", err);
setErrors(err)
});
}
(примечание: it — это просто соглашение об именах, заимствованное из Kotlin, оно делает код JavaScript короче. Это псевдоним для всего, что находится в левой части выражения, в данном случае для response)
Ну и как на самом деле выглядит ответ?