2013-07-05 63 views
2

這裏是我們的控制器:FosRestbundle不斷髮送text/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); 
    } 

這裏是fosrestbundle的config.yml:

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? Ho wcan我們強制響應成爲application/json?

請幫助,因爲這是目前

+0

既然有' - > setStatusCode()',有可能也是一種方法用於設置響應MIME類型。沒有手冊嗎? – mario

+0

FosRestBundle默認應該做JSON,但是我的服務器一直在發送文本/ html – jini

+0

你如何測試它? –

回答

11

你是靜態創建視圖並沒有啓用任何聽衆造成巨大的痛苦。

這種方式不涉及格式猜測。

傳遞格式參數的功能,並設置查看對象的格式:

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

參見文檔章節The View Layer


如果你想自動格式猜測你必須啓用聽衆

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

更多的章節Listener Support英寸

0

或者,如果你不能依靠$ _format(對我來說)你可以明確的設置,像這樣的格式:

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

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