FosRestbundle продолжает отправлять текст / html в качестве ответа, и мы ожидаем json.

Вот наш контроллер:

function getLocationsAction(Request $request) {

        $dm = $this->get('doctrine.odm.mongodb.document_manager');
        $query = $dm->createQueryBuilder('MainClassifiedBundle:Location')->select('name', 'state', 'country', 'coordinates');
        $locations = $query->getQuery()->execute();

        $data = array(
            'success' => true,
            'locations' => $locations,
            'displaymessage' => $locations->count() . " Locations Found"
        );

        $view = View::create()->setStatusCode(200)->setData($data);
        return $this->get('fos_rest.view_handler')->handle($view);
    }

Вот config.yml для fosrestbundle:

fos_rest:
    view:
        formats:
            json: true
        templating_formats:
            html: true
        force_redirects:
            html: true
        failed_validation: HTTP_BAD_REQUEST
        default_engine: twig

Вот маршрут:

MainClassifiedBundle_get_locations:
    pattern:  /locations/
    defaults: { _controller: MainClassifiedBundle:ClassifiedCrudWebService:getLocations, _format:json}
    requirements:
        _method:  GET

Почему мы получаем text / html? Как мы можем заставить ответ быть application / json?

Пожалуйста, помогите, так как в данный момент это вызывает огромные боли


person jini    schedule 05.07.2013    source источник
comment
Поскольку существует ->setStatusCode(), вероятно, существует также метод установки типа mime ответа. Нет инструкции?   -  person mario    schedule 05.07.2013
comment
FosRestBundle по умолчанию должен использовать JSON, однако мой сервер продолжает отправлять текст / html   -  person jini    schedule 05.07.2013


Ответы (2)


Вы создаете свое представление статически и не включили никаких слушателей.

Таким образом, не требуется угадывать формат.

Передайте формат в качестве аргумента вашей функции и установите формат для объекта View:

function getLocationsAction(Request $request, $_format) {
{
    // ...
    $view = View::create()
         ->setStatusCode(200)
         ->setData($data)
         ->setFormat($_format)   // <- format here
    ;
    return $this->get('fos_rest.view_handler')->handle($view);
}

См. Главу документации Слой просмотра.


Если вы хотите автоматически угадывать формат, вам необходимо включить слушателей.

fos_rest:
    param_fetcher_listener: true
    body_listener: true
    format_listener: true
    view:
        view_response_listener: 'force'

Подробнее читайте в главе Поддержка слушателей < / а>.

person Nicolai Fröhlich    schedule 05.07.2013

Или, если вы не можете полагаться на $ _format (в моем случае), вы можете явно установить формат следующим образом:

    public function createAction(Request $request): Response
{
    // ...

    return $this->viewHandler->handle(View::create($json)->setFormat('json'));
}
person ShaneMit    schedule 28.07.2016