Partage
  • Partager sur Facebook
  • Partager sur Twitter

cURL méthode GET ok mais méthode POST erreur

Sujet résolu
    19 janvier 2020 à 17:18:43

    Bonjour, je rencontre un problème et j'espère réussir à trouver de l'aide ici. :aie:

    Alors voilà, j'appelle une API pour en utiliser des foncitonnalités. Pour "récupérer" le code donc j'ai besoin je lance d'abord la fonctionnalité sur POSTMAN puis je récupère le code que j'arrange ensuite comme j'en ai besoin. Cela marche très bien pour les fonctions GET, je récupère tout ce qu'il faut mais pas pour les fonctions POST. J'obtiens une erreur me disant qu'il y a besoin d'un "body" pour utiliser la fonction. Cependant je pense remplis le POSTFIELD comme il faut donc je ne vois pas d'ou vient l'erreur...
    Voici mes codes, une en GET et une en POST ainsi que l'erreur obtenue:

    Voici la fonction en GET qui me renvoie bien les informations voulues

    $token_file=fopen("headers.txt","r");
    
            $i=0;
            while($i<2)
            {
                $token=fgets($token_file);
                $i++;
            }
            fclose($token_file);
    
    $curl=curl_init();
    
            curl_setopt_array($curl,array(
                CURLOPT_URL=>"monURLGET",
                CURLOPT_RETURNTRANSFER=>true,
                CURLOPT_ENCODING=>"",
                CURLOPT_MAXREDIRS=>10,
                CURLOPT_TIMEOUT=>0,
                CURLOPT_FOLLOWLOCATION=>true,
                CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST=>"GET",
                CURLOPT_HTTPHEADER=>array(
                    $token),
            ));
    
    
            $parsee=json_decode(curl_exec($curl), true);
            curl_exec($curl);
            curl_close($curl);

    Voici la fonction en POST qui me renvoie une erreur

    $token_file=fopen("headers.txt","r");
    
            $i=0;
            while($i<2)
            {
                $token=fgets($token_file);
                $i++;
            }
            fclose($token_file);
    
     $curl=curl_init();
    
                        curl_setopt_array($curl,array(
                            CURLOPT_URL=>"monURLPOST",
                            CURLOPT_RETURNTRANSFER=>true,
                            CURLOPT_ENCODING=>"",
                            CURLOPT_MAXREDIRS=>10,
                            CURLOPT_TIMEOUT=>0,
                            CURLOPT_FOLLOWLOCATION=>true,
                            CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
                            CURLOPT_CUSTOMREQUEST=>"POST",
                            CURLOPT_POSTFIELDS=>"{\n\"nom\":\"test\",\n\"origine\":\"test\"\n}", //c'est normal qu'il y ai les " et \, dans une version précédente de l'API je le faisais  //avec et cela marchait très bien
                            CURLOPT_HTTPHEADER=>array(
                                $token,
                                "Content-Type:application/json"
                            ),
                        ));
    
                        curl_exec($curl);
    
                        curl_close($curl);

    Voici l'erreur obtenue:

    {"timestamp":"2020-01-19T15:53:23.926+0000","status":400,"error":"Bad Request","message":"Required request body is missing: public org.springframework.http.ResponseEntity fr.nom.apiFNC.LibraryController.fonction(fr.nom.apiFNC.model.json.User)","path":"chemin"}

    Merci pour votre aide !


    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2020 à 18:04:06

      C'est peut être une erreur de syntaxe dans les paramètres que tu envoies (https://developer.mozilla.org/fr/docs/Web/HTTP/Status/400). Dans le CURLOPT_POSTFIELDS, au lieu de lui fournir une chaine à l'arrache, donne lui plutot un tableau encodé en json ;). C'est plus propre et tu es sur de ne pas avoir d'erreur de syntaxe.

      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2020 à 18:20:06

        Bonsoir BeebleBrox, merci beaucoup pour ta réponse !Je vais poser des questions qui sont surement basiques mais je débute alors ne m'en voulez pas :honte:

        cependant je ne vois pas comment faire... en effet cela peut se présenter de cette manière:

        {"utilisateur":{"id":0,"nom":"string","prenom":"string","fonction":"string","niveau":0,"mail":"string"},"account":{"login":"string","mdp":"string"}

        Ce sont des tableaux avec des nom, comment savoir le nom lors de la création d'un tableau encodé JSON ?de plus certaines variables sont auto incrémentées (l'id par exemple), cela sera-t-il toujours incrémenté

        Mais je ne vois pas pourquoi la chaine de caractère ne marcherait pas. C'est celle qui est donnée lorsque je mets la fonctionnalité sur postman et cela marche très bien...

        Encore merci!

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2020 à 18:48:17

          Houlalala j'ai oublié mes bonnes manières ! Donc avant de te répondre, bonsoir blableblibloblu.

          La chaine que tu assignes à CURLOPT_POSTFIELDS est justement une chaine JSON. Pour faire simple, le format JSON c'est une chaine de caractères formatée qui représente un ensemble de données. En PHP il s'agit généralement de l'ensemble des valeur d'un tableau ou propriétés publiques d'un objet, en javascript c'est plutot des objets/listes. La plupart des langages de programmation proposent des outils pour manipuler du JSON.

          En PHP tu as json_encode et json_decode. Je t'invite à jeter un oeil à la doc php pour ces deux fonctions.

          Si sur Postman ça marche d'accord, le problème ne vient pas de là, mais il n'empêche que ça reste plus propre ;). Du coup je ne vois pas comment je peux t'aider sans connaitre l'API que tu souhaites consommer. Tu as une doc du service ou la liste des paramètres qu'il attend ?

          EDIT : En relisant ton code, je me dis que le soucis vient de là :

          CURLOPT_HTTPHEADER=>array(
                                      $token,
                                      "Content-Type:application/json"
                                  ),

          Ajoute un espace apres les : de Content-Type

          CURLOPT_HTTPHEADER=>array(
                                      $token,
                                      "Content-Type: application/json"
                                  ),




          -
          Edité par BeebleBrox 20 janvier 2020 à 1:23:08

          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2020 à 19:28:23

            Bonsoir BeebleBrox

            Encore merci pour ta réponse, cependant, même en ajoutant un espace cela ne fonctionne pas, 

            voici la liste des paramètres attendus : 

            {"nom":"string","origine":"string"}
            Encore merci! 
            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2020 à 19:43:24

              C'est qu'il y a un autre soucis, l'espace est obligatoire quoiqu'il advienne ;).

              Peux tu montrer la valeur de ta variable $token ? J'imagine que tu dois avoir la même ou une autre erreur de syntaxe sur l'entête HTTP qui y est décrite. La valeur du token ne m’intéresse pas, tu peux la masquer :)

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2020 à 20:23:42

                $token renvoie 

                Bearer: laVariableDuToken

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2020 à 20:44:11

                  C'est donc la ta deuxième erreur. Bearer n'est pas une entête HTTP mais une option de l'entête HTTP Authorization. du coup ton token devrai plutôt être :

                  Authorization:Bearer laVariableDuToken

                  https://developers.google.com/gmail/markup/actions/verifying-bearer-tokens

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 janvier 2020 à 21:20:12

                    Je ne comprends pas, si c'était là le problème, pourquoi lorsque je fais exactement la même méthode pour une GET (premier code du post) ça marche ?

                    J'ai essayé en mettant le Authorization devant et ça me fait une erreur 401, non autorisée à l'accès de la fonctionnalité...

                    -
                    Edité par débutanteEnCodageSiteWeb 19 janvier 2020 à 21:26:46

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 janvier 2020 à 21:45:46

                      S'en était un je te l'assure. Revois la doc sur le code http 400. Maintenant tu as une 401, ça veut dire que ta requête est dorénavant bien écrite. Ton problème vient de ton token dorénavant je suppose.

                      https://developer.mozilla.org/fr/docs/Web/HTTP/Status/401

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 janvier 2020 à 22:24:09

                        Je veux bien te croire que c'était un problème :honte:

                        Cependant je ne comprends pas pour les GET sans avoir mis Authorization marchent ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 janvier 2020 à 23:18:49

                          En très gros, parce que en GET tu passe tous tes paramètres dans l'URL. En POST ce sont des en têtes que l'on définit, l'un permet de passer des paramètre pour renseigner le $_POST de PHP par exemple et plein d'autre comme ce que tu fais avec ton token d'authentification. Je te conseille de voir de la doc sur le protocole HTTP, c'est vite indispensable quand on développe dans le web et à plus forte raison quand on bosse avec une API

                          -
                          Edité par BeebleBrox 19 janvier 2020 à 23:19:34

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 janvier 2020 à 15:08:38

                            L'idée derrière mon conseil est que tu comprennes que chaque code HTTP que tu reçois en réponse peut t'aider à potentiellement définir le problème que tu rencontres :).

                            Du coup, t'en es tu sorti ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 janvier 2020 à 18:19:46

                              oui finalement c'était un problème de saut de ligne dans le fichier text, merci :)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              cURL méthode GET ok mais méthode POST erreur

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown