Я настроил FOSRestBundle следующим образом:
#FOSRestBundle
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener:
rules:
- { path: ^/, priorities: [ json, html ], fallback_format: ~, prefer_extension: true }
media_type:
version_regex: '/(v|version)=(?P<version>[0-9\.]+)/'
body_converter:
enabled: true
validate: true
view:
mime_types:
json: ['application/json', 'application/json;version=1.0', 'application/json;version=1.1']
view_response_listener: 'force'
formats:
xml: false
json: true
templating_formats:
html: true
exception:
codes:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
messages:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': true
allowed_methods_listener: true
access_denied_listener:
json: true
И у меня есть это на контроллере:
namespace PDI\PDOneBundle\Controller\Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use FOS\RestBundle\Controller\Annotations\Get;
class RepresentativeRestController extends FOSRestController
{
/**
* Get all representatives.
*
* @return array
*
* @ApiDoc(
* resource = true,
* https = true,
* description = "Get all representatives.",
* statusCodes = {
* 200 = "Returned when successful",
* 400 = "Returned when errors"
* }
* )
* @Get("/api/v1/reps")
*/
public function getRepsAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('PDOneBundle:Representative')->findAll();
if(!$entities)
{
return $this->view(null, 400);
}
return $this->view($entities, 200);
}
}
Но когда я пытаюсь использовать следующий URL-адрес app_dev.php/api/v1/reps
, я получаю эту ошибку:
Не удалось найти шаблон "". 500 Внутренняя ошибка сервера — InvalidArgumentException 3 связанные исключения: Twig_Error_Loader » InvalidArgumentException » InvalidArgumentException »
Я ожидаю, что API вернет правильно сформированный JSON, как в следующем примере:
{
"id":"30000001",
"veeva_rep_id":"0055648764067SwzAAE",
"display_name":"John Know",
"avatar_url":"http://freelanceme.net/Images/default%20profile%20picture.png",
"rep_type":"VEEVA",
"username":"[email protected]",
"first":"John",
"last":"Know",
"title":"Sales Representative",
"phone":"800-555-1212",
"email":"[email protected]",
"territory_id":"200454001",
"inactive":"no",
"total_contacts":"6",
"total_shares":"0",
"totalViews":"0",
"lastLoginAt":"2015-05-05 15:45:57",
"lastVeevaSyncAt":"2015-05-05 15:45:57",
"createdAt":"2015-05-05 15:45:57",
"updatedAt":"2015-05-05 15:45:57"
}
Разве FOSRestBundle не настроен для возврата JSON? Почему все еще просите шаблон Twig? Как я могу это исправить?
Первый тест:
Как подсказывает мне @Jeet, я пытался использовать Postman (это то же самое расширение, которое он мне сказал), и после установки заголовка Content-Type
в application/json
ошибка превращается в это
Неверный формат JSON
Итак, FOSRestBundle не настраивает заголовки должным образом, а контроллер не возвращает действительный JSON, как мне исправить эти заголовки?
Второй тест:
Как предложил @Jeet, я запускаю этот тест:
/**
* Get all representatives.
*
* @return array
*
* @ApiDoc(
* resource = true,
* https = true,
* description = "Get all representatives.",
* statusCodes = {
* 200 = "Returned when successful",
* 400 = "Returned when errors"
* }
* )
* @Get("/api/v1/reps")
* @View()
*/
public function getRepsAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('PDOneBundle:Representative')->findAll();
$temp = array("1", "2", "3");
$view = $this->view($temp, Codes::HTTP_OK);
return $this->handleView($view);
}
И все та же проблема:
Не удалось найти шаблон "". 500 Внутренняя ошибка сервера — InvalidArgumentException 3 связанные исключения: Twig_Error_Loader » InvalidArgumentException » InvalidArgumentException »
Что еще здесь может быть не так? Я что-то упустил при настройке?
Сначала я забыл добавить app/config/routing.yml
и src/PDI/PDOneBundle/Resources/config/routing.yml
, так что вот они, возможно, это недостающая часть головоломки, которая даст вам лучшее представление о том, откуда возникла проблема:
#app/config/routing.yml
#PDOne
pdone:
resource: "@PDOneBundle/Resources/config/routing.yml"
template:
resource: "@TemplateBundle/Resources/config/routing.yml"
#FOSUserBundle
fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
prefix: /
#NelmioApiDocBundle:
NelmioApiDocBundle:
resource: "@NelmioApiDocBundle/Resources/config/routing.yml"
prefix: /api/doc
#SonataAdmin
admin:
resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
prefix: /admin
_sonata_admin:
resource: .
type: sonata_admin
prefix: /admin
#src/PDI/PDOneBundle/Resources/config/routing.yml
pdone:
resource: "@PDOneBundle/Controller/"
type: annotation
prefix: /
Третий тест:
Определенно что-то не так с запросом со стороны клиента, если я использую такой инструмент, как Postman
и устанавливаю правильные заголовки, я получаю объекты, как я хочу, см. рис. ниже:
Я не могу найти, в чем проблема, поэтому мне отчаянно нужна чья-то помощь, потому что у меня уже не было идей.
FOSRestBundle
отвечает за установку заголовка для ответа, отправляемого клиенту. Но его клиент (мобильное приложение, расширение клиента REST) обязан установить правильные значения заголовка при отправке его на сервер.FOSRestBundle
может ответить соответствующим образом. ;) - person Jeet   schedule 11.05.2015$entities
не удалось нормализовать до Джейсона, поскольку у меня был такой же опыт. Попробуйте отправить простой массив и посмотрите, все ли в порядке с данными JSON. - person Jeet   schedule 11.05.2015content-type
значениеapplication/json
, как это делает ваше расширение Postman. - person Jeet   schedule 12.05.2015