Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FosRestbundle keeps sending text/html as response and we are expecting json.

Here is our controller:

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);
    }

Here is the config.yml for fosrestbundle:

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

Here is the route:

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

Why are we getting text/html ? Ho wcan we force the response to be application/json?

Please help as this is causing huge pains at the moment

like image 373
jini Avatar asked Dec 15 '22 09:12

jini


1 Answers

You are creating your view statically and have not enabled any listeners.

This way there is no format guessing involved.

Pass the format as argument to your function and set the format on the View object:

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);
}

See the documentation chapter The View Layer.


If you want automatic format guessing you have to enable the listeners.

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

Read more in the chapter Listener Support.

like image 103
Nicolai Fröhlich Avatar answered Apr 07 '23 02:04

Nicolai Fröhlich