HTTP-ответ Symfony не содержит указанного тела

Я использую следующий код javascript для выполнения HTTP-запроса:

function ready(path) {
    fetch(path, {method : 'put'})
        .then(function (response) {
            console.info(response);
        });
}

Этот запрос запускает на моем сервере следующую функцию:

/**
 * @Route("/some/route/{playerName}", name = "ready")
 * @param $playerName string
 */
public function toggleReady($playerName) {
    $this->someService->readyUp($playerName);

    $response = new Response(
        'TOGGLE SUCCESS!',
        Response::HTTP_OK,
        array('content-type' => 'text/html'));
    $response->send();
}

На стороне клиента вызывается then, который выводит ответ в консоль. Этот ответ содержит правильный код состояния, но тело пустое, а bodyUsed - это false. Как я могу правильно отправить желаемый контент / тело во фронтенд?

Вы пробовали использовать атрибут body вместе с атрибутом method? developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fet‌ ch

jasie 14.01.2019 15:17

Также попробуйте следующее: .then (response => console.info ('Success:', JSON.stringify (response))) .catch (error => console.error ('Error:', error));

jasie 14.01.2019 15:18

Насколько я понимаю, атрибут body для fetch устанавливает тело запроса и не влияет на то, какой ответ я получаю.

hildebro 14.01.2019 15:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
412
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вам нужно сделать это:

fetch(path, {method : 'put'})
  .then(response => response.json())
  .then(data => {
    // Here's the content of the body
    console.info(data)
});

«Оказывается, то, что мы запрашивали, скрыто в теле как читаемый поток. Нам нужно вызвать соответствующий метод, чтобы преобразовать этот читаемый поток в данные, которые мы можем потреблять.

В случае работы с GitHub мы знаем, что ответ - JSON. Мы можем вызвать response.json для преобразования данных.

Есть и другие методы работы с разными типами ответов. Если вы запрашиваете XML-файл, вам следует вызвать response.text. Если вы запрашиваете изображение, вы вызываете response.blob ".

См. https://css-tricks.com/using-fetch/

Поскольку ваш заголовок Content-Type - это text/html, вам следует проанализировать тело ответа как текст с помощью метода .text(), который возвращает обещание:

fetch(path, { method: 'put' })
  .then(response => response.text())
  .then(body => console.info(body))
  .catch(err => console.error(err));

Кроме того, text/plain будет более точным, чем text/html.

Другие вопросы по теме