FOSRestBundle le programme d'installation pour le retour JSON, mais demande toujours template Twig
J'ai configuré FOSRestBundle comme suit:
#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
Et j'ai ce au contrôleur:
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);
}
}
Mais quand j'essaie de l'URL suivante app_dev.php/api/v1/reps
j'ai eu cette erreur:
Impossible de trouver le modèle "". 500 Internal Server Error -
InvalidArgumentException 3 lié Exceptions: Twig_Error_Loader »
InvalidArgumentException » InvalidArgumentException »
J'attends que l'API de retour d'un bien formé JSON comme l'exemple suivant:
{
"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"
}
N'est pas FOSRestBundle configuré pour le retour JSON? Pourquoi toujours demander de template Twig? Comment puis-je résoudre ce problème?
Premier test:
@Jeet suggèrent moi, j'ai essayé d'utiliser le Facteur (qui est le même que l'extension, il m'a dit) et après la tête Content-Type
à application/json
l'erreur se transforme en ce
Mal formé JSON
donc, le FOSRestBundle n'est pas de mise des en-têtes comme devrait l'être et le contrôleur n'est pas un retour JSON valide, comment puis-je corriger?
Deuxième test:
Comme suggéré par @Jeet j'ai l'exécution de ce test:
/**
* 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);
}
Et toujours le même problème:
Impossible de trouver le modèle "". 500 Internal Server Error -
InvalidArgumentException 3 lié Exceptions: Twig_Error_Loader »
InvalidArgumentException » InvalidArgumentException »
Quoi d'autre peut être le problème ici? Ne me manque quelque chose dans la configuration?
J'ai oublié d'ajouter app/config/routing.yml
et src/PDI/PDOneBundle/Resources/config/routing.yml
au premier abord donc, ici, va, c'est peut-être la pièce manquante du puzzle et vous donner une meilleure idée d'où vient le problème:
#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: /
Troisième test:
Certainement quelque chose de mal avec la demande du client, si j'utilise un outil comme Postman
et de définir des en-têtes que j'ai les entités que je veux, voir photo ci-dessous:
Je ne trouve pas où le problème est que j'ai désespérément besoin de l'aide de quelqu'un ici, parce que j'étais déjà d'idées
où je devrais le faire? N'est pas à la configuration de FOSRes comme vous pouvez le voir sur l'OP?
Essayez app_dev.php/api/v1/répétitions dans Google Chrome Avancée du Reste de l'application Client (application de l'extension), là, vous aurez une option.
voir l'OP, j'ai édité l'ajout de quelques infos
FOSRestBundle
est responsable de définir l'en-tête de la réponse qu'elle envoie au client. Mais son client(APPLICATION Mobile, le client REST extension) est un devoir de corriger les valeurs d'en-tête lors de l'envoi au serveur. Le FOSRestBundle
peut réagir en conséquence. 😉OriginalL'auteur ReynierPM | 2015-05-08
Vous devez vous connecter pour publier un commentaire.
Que les gars suggéré: seulement Accepter d'en-tête ou d'extension pourrait vous donner un JSON. On dirait que vous avez ce triée avec en-tête Accept.
Pour l'utilisation de l'extension, vous devez l'indiquer comment voulez-vous régler le format de choses dans Symfony.
Ce code devrait vous donner une sortie que vous voulez:
Edit1: si vous ne souhaitez pas utiliser un
View
de classe, mais par pure tableaux: ne pas oublier d'interdire l'Affichage de la manipulation de SensioExtraBundleEdit2: Si vous n'utilisez pas le format HTML et ne veux avoir une sortie json, vous pouvez utiliser ces fonfiguration:
Explication pourquoi vous obtenez une erreur "non trouvé":
TL;DR: votre navigateur envoyer un en-tête Accept que dit FOSRestBundle à la sortie d'un 'html' variante.
Arrière-plan: Ce bundle fonctionne la plupart du temps à Accepter les en-têtes, c'est une bonne pratique d'avoir tous les possible les formats de sortie sont disponibles: html (vous pouvez tester votre API REST avec les formes que vous fournissez, des listes d'objets, des détails des objets facilement de cette façon), json, xml. Parfois même image des types mime image/jpeg, image/png, en tant que par défaut ou json/xml comme variante, vous pouvez utiliser base64 représentation de l'image).
Explication: Si vous ouvrez un onglet "réseau" d'un navigateur et vérifier les en-têtes de il envoie, vous remarquerez quelque chose comme:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
qui signifie "utilisation de la commande":Si vous regardez de plus près à ce qui est, vous verrez que selon votre configuration texte/html est l'une des variantes que votre configuration a ('html') et */* en est une autre ('json'), mais texte/html a une priorité de 1, alors */* a une priorité de 0,8, donc texte/html matchs et FOSRestBundle essaie de trouver une représentation HTML et échoue.
PS: Si vous postez question plusieurs fois - s'il vous plaît assurez-vous que vous regardez pour toutes les réponses dans chaque thread.
OriginalL'auteur Artem L
Vous pouvez donner une réponse dans deux façons
ou
Content-Type
si j'essaie de navigateur, j'ai eu le même problème avec le template qui me fait me demander: pourquoi? où est le problème sur la configuration et pourquoi pas les en-têtes d'installation de droit? Aussi, je voudrais retourner une sorte deNotFoundException
si il n'y a pas$entities
, pouvez-vous me montrer comment réaliser cela dans votre code?OriginalL'auteur Farid Movsumov
FosRestBundle tire parti de l'en-Tête Accept. Cela signifie qu'il renvoie une réponse, en fonction de ce que vous demandez. En accédant à la route "app_dev.php/api/v1/reps", vous êtes implicitement demandant un format html, donc essaie de fournir un modèle.
Ne app_dev.php/api/v1/reps.json retour ce dont vous avez besoin?
Vous devez également tester app_dev.php/api/v1/reps.xml et s'attendre à une sortie xml
.html
ou.json
ou.xml
j'ai eu 404 route d'erreur, je ne trouve pas ce qui me manque dans ma config ou au contrôleur de côtéVotre réponse a la solution, mais elle est implicite dans le contenu. Vous devez décrire précisément que pour des tests avec des clients tels que google Chrome/Firefox RestClient extension À régler correctement l'en-tête Accept:application/json
OriginalL'auteur pcm
Vous pouvez utiliser simplement
OriginalL'auteur Dr.X