Symfony API-запрос неожиданный "G"

Я действительно сбит с толку этой ошибкой, которую я получаю при публикации в API Книг Google. Последний ответ в этой функции срабатывает при публикации 1781100489 к форме. Затем эта форма запускается resultAction функция. Вместо того, чтобы возвращать то, что я хочу, я получаю ошибку JSON.parse с неожиданным токеном в строке 1 столбца 1.

При тестировании с почтальоном, он дает мне это своеобразное сообщение в своем ответе Unexpected 'G', Что бы это могло значить? Я дамп переменной, как вы можете видеть, это прокомментировано, но не могу понять, почему это происходит.

Есть какие-нибудь подсказки?

public function findAction(Request $request)
{
    $form = $this->createFormBuilder(null, ['csrf_protection' => false])
        ->add('Title', TextType::class)
        ->add('Search', SubmitType::class)
        ->getForm();

    $form->handleRequest($request);

    if($form->isValid()){
        $json = file_get_contents("https://www.googleapis.com/books/v1/volumes?q=".$form->get('Title')->getData());
        $response = json_decode($json, true);

        if(array_key_exists('items', $response)){
            return $this->render('BlogsiteBooksBundle:Pages:results.html.twig', [
                'items' => $response['items']
            ]);
        } else {
            return new Response('Google did not have any items', 400);
        }
    }

    //var_dump($request);

    return new Response('Google Book Not Found', 404);
}

1 ответ

Решение

Ваш запрос не связан с формой, создайте форму с помощью компонента формы Symfony в контроллере и вручную в ветке, тогда имена параметров не совпадают. $form->handleRequest($request); не могу найти заголовок, потому что ожидаем параметр с именем form[Title] и вы проходите только Title,

Решения:

1 - отправить вручную все заданные параметры в запросе

Изменить:

$form->handleRequest($request);

За это:

$form->submit($request->query->all());

2 - Измените имя ввода так, чтобы оно совпадало с ожидаемым именем Symfony, а используемый метод должен быть POST:

<form action="app_dev.php/find" method="post">
        <input type="text" name="form[Title]" id="Title" value="">
        <input type="submit" value="Search">
    </form>

3 - Визуализируйте форму, используя форму ветки, чтобы избежать этой проблемы.

контроллер:

    /**
     * @Route(name="find", path="/find")
     */
    public function findAction(Request $request)
    {
        $form = $this->createFormBuilder(null)
                     ->add('Title', TextType::class)
                     ->add('Search', SubmitType::class)
                     ->getForm();

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $json = file_get_contents("https://www.googleapis.com/books/v1/volumes?q=".$form->get('Title')->getData());
            $response = json_decode($json, true);
            if (array_key_exists('items', $response)) {
                return $this->render(
                    'BlogsiteBooksBundle:Pages:results.html.twig',
                    [
                        'items' => $response['items'],
                    ]
                );
            } else {
                $form->addError(new FormError('Google did not have any items'));
            }
        }

        return $this->render('find.html.twig', ['form' => $form->createView()]);
    }

Посмотреть find.html.twig:

{{ form(form) }}

Примечание: каждая точка является возможным решением, используйте только один из них, третий рекомендуется для простых форм Symfony.

Я имел дело с той же ошибкой в ​​POSTMAN. Я искал ответы, но мою проблему ничто не удовлетворило. Я сам обнаружил, что это выражение "exit();" в моем файле PHP. Я удалил его, и моя проблема была решена. Надеюсь, мое решение кому-то поможет.

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