Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser une api et un controller avec Symfony

    28 avril 2024 à 14:15:48

    Bonjour à tous,

    Je me demandais si il était possible de crée une API (qui est en place) crée avec ApiPlateform et symfony et dans le même projet me connecter à cette api au sein de controlleurs ?

    Pourquoi faire cela vous me direz ?

    L'idée et d'avoir une api accesible avec un service ou une plateforme externe voir même la création d'une app mobile par la suite, et de pouvoir utiliser cette api avec mes templates TWIG et un controlleur "standard".

    Enfaite j'essaye de me connecter à mon API en aillant lancer un serveur php normal au seins de mon projet Symfony

    php -S localhost:3000

    ensuite je créer un service comme cela par exemple (j'ai essayer une connection avec

    CurlHttpClient

     et

    HttpClientInterface
    <?php
    
    namespace App\Service;
    
    use Symfony\Component\HttpClient\CurlHttpClient;
    use Symfony\Contracts\HttpClient\HttpClientInterface;
    
    class ApiConnectionService {
    
        public function __construct(
            private HttpClientInterface $client)
            {}
        public function getUser(): array
        {
            $client = new CurlHttpClient();
            $response = $this->client->request(
                'GET',
                'http://localhost:3000//api/users',
                [
                    'headers' => [
                        'Authorization' => 'Bearer token',
                        'accept' => 'application/ld+json',
                        'Content-Type' => 'application/json',
                        'Sec-Fetch-Site' => 'same-origin'
                    ],
                ]
            );
    
            $statusCode = $response->getStatusCode();
    
            $contentType = $response->getHeaders()['content-type'][0];
    
            $content = $response->getContent();
    
            $content = $response->toArray();
    
    
            if($statusCode != 200){
                dd($statusCode);
            }
            return $content;
        }
    
    }


    Ensuite toujours dans l'idée je suis juste en phase de test, je récupère mon service dans mon controller

        public function index(ApiConnectionService $api): Response
        {
    
            dd($api->getUser());
            
            return $this->render('api_connection/index.html.twig', [
                'users' => $api->getUser(),
            ]);
        }

    mais la j'ai une erreur 500

    fopen(http://127.0.0.1:3000//api/users): Failed to open stream: Aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée

    J'accède à mon api avec Postmann, cela fonctionne nikel mais j'arrive pas comprendre (ou peut être est-ce pas possible) pourquoi j'arrive pas me connecter au seins du même projet.

    Poiur info j'ai tester mon code avec SWAPI et sa fonctionne nikel, j'ai aussi tester avec une requete Curl "CurlHttpClient" et "HttpClientInterface", les erreurs sont pas parerils mais dans tous les cas je n'arrive pas à me connecter.

    J'espère que vous avez une petite idée et vous en remercie.

    A+

    Julien





    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2024 à 9:21:19

      Salut

      Est-ce que cela ne viendrait pas des deux slashes après le port ?

      • Partager sur Facebook
      • Partager sur Twitter
        7 mai 2024 à 11:01:05

        Du coup, pas de réponse à donner ?

        Autre question : comment est-ce que le projet principal fonctionne ? Uniquement en lignes de commandes, avec un serveur web, lequel ?

        Tu as deux projets, ou un unique accessible par deux ports/deux adresses ?

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2024 à 7:26:54 - Message modéré pour le motif suivant : Message complètement hors sujet


            12 mai 2024 à 7:49:43

            Hello Ymox, merci pour ta/tes réponse. Excuse ma réponse tardive, vacances oblige ;-)

            Alors du coup, non le projet ne donctionne pas uniquement ligne de commande, je start mon serveur php avec les lignes de commandes, c'est un projet Symfony standard.

            Mais du coup j'ai réussi à lancer le projet en lancant 2 serveurs avec la commande php comme ceci :

            php -S localhost:3000 -t c:\wamp64\www\otime-api\public

            et

            php -S localhost:3001 -t c:\wamp64\www\otime-api\public

            je peux ensuite avoir un visuel du front en me connectant sur localhost:3001 et faire mes requetes API sur le port 3000.

            Je pense que c'est le mieux à faire, maintenant est-ce que en prod sur un serveur sa fonctionne, à tester.




            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2024 à 21:46:37

              Tu peux tout de suite oublier l'utilisation du serveur intégré à PHP en production, il n'est absolument pas prévu pour, niveau sécurité notamment.

              Je te recommanderais plutôt de "dédoubler" le dossier public et de n'y mettre que le fichier index.php. Ce nouveau dossier permettra d'avoir la racine d'un nouvel hôte virtuel, éventuellement pour un sous-domaine, et cela servirait pour la partie API uniquement.

              Edit

              Seulement, je pense que tu n'as pas nécessairement besoin d'un autre serveur ou d'un autre hôte virtuel pour accéder à l'API, du moins dans un premier temps, vu que tout semble géré par le même code. Par contre, je ne comprends pas trop pourquoi le serveur interne de PHP ne permettrait pas les "appels internes", de lui-même à lui-même, à part pour ce que j'ai relevé dans la syntaxe de l'URL de connexion. Il se peut qu'il y ait d'autres éléments de configuration, mais cela ne concernerait que l'environnement de développement, Apache/nginx n'ayant à ma connaissance pas besoin de réglages spécifiques pour cela.

              -
              Edité par Ymox 13 mai 2024 à 9:18:49

              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2024 à 20:44:53

                Super, merci pour ta réponse.

                Je vais regarder cela et effectivement cela provient peut être d'une mauvaise configuration de apache.

                Encore merci

                A+

                Julien

                • Partager sur Facebook
                • Partager sur Twitter

                Utiliser une api et un controller avec Symfony

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown