IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Appel PHP à partir de FirebaseInstanceIDService


Sujet :

Android

  1. #1
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut Appel PHP à partir de FirebaseInstanceIDService
    Bonjour à toutes et tous,

    Des années de programmation itérative me font facilement devenir chèvre dès lors qu'il s'agit de transmettre des informations entre deux processus distincts !

    Je mets en place une simple notification. Mon service est activé, et j'obtiens les notifications lancées à partir de la console Firebase. L'étape suivante consistait à envoyer des notifications à partir de mon serveur, de façon dynamique, via un petit script php. Là encore, je trouve de quoi faire mais surprise, j'apprends que Google ne fait pas du "all users" ! Il ne suffit donc pas que j'envoie une notification (très simple : "y a un nouveau message, ouvrez votre appli !") à mon projet sous Firebase qui se chargerait ensuite de le transmettre à tous les postes inscrits. C'est public, donc même pas d'authentification, juste un RegistrationId.

    Bon, donc, il faut récupérer le RegistrationId de chaque poste mobile, l'enregistrer dans ma base, et quand j'envoie une notification à Firebase, je lui transmets tous les RegistrationId ? Ok, c'est un peu dommage que le service n'aille pas jusqu'au bout, mais parions qu'il y a d'excellentes raisons à ça, et puis je peux râler pendant 100000 ans, ça ne changera rien...

    Je fais donc une classe en extend de FirebaseInstanceIDService, avec déclaration au manifeste et tout et tout, je récupère bien mon RegistrationId dans la méthode onTokenRefresh()... mais comment je la communique à mon script php distant ????!!!

    Execute ? Il ne veut pas, c'est pas la MainActivity !
    Une interface pour rebasculer sur le Main ? Ben oui, mais comme mon Activité et mon FirebaseInstanceIDService perso sont deux process distincts (l'un n'appelle pas l'autre), je ne vois pas comment transmettre l'info de l'un à l'autre. Les interfaces, je ne sais en faire qu'en déclarant l'objet dans l'un des process et en l'instruisant dans l'autre...
    Les méthodes et objets de l'import com.android.volley ? J'ai beau faire, je n'arrive pas à comprendre comment les manipuler. Les exemples que j'ai sont complexes, quand je ne veux au final que transmettre une chaine à un code php...

    Avant même de transmettre du code ici, quelqu'un saurait-il donc s'il existe une méthode "simple" (tout est relatif sous Android !) pour lancer un script PHP (qui ne retournera aucune réponse, soit dit en passant) à partir d'un processus qui n'est pas la MainActivity ?

    Merci de votre aide.
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Je comprend pas bien ton problème.

    Il suffit de faire une requette HTTP vers ton script PHP avec en paramètre le token le tout dans ta fonction onTokenRefresh();

    Exemple pour une requête POST :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    URL url = new URL("http://monsite.com/monscript.php");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoInput(true);
    conn.setDoOutput(true);
     
    Uri.Builder builder = new Uri.Builder()
            .appendQueryParameter("tokennotif", "montoken")
            .appendQueryParameter("autreparam", "autreparam");
    String query = builder.build().getEncodedQuery();
     
    OutputStream os = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
    writer.write(query);
    writer.flush();
    writer.close();
    os.close();
     
    conn.connect();
    Note : HttpsURLConnection qui est le nouveau client http par défaut depuis android 6 est pour moi incompréhensible. En général je lui préfère une lib tiers du genre Apache httpclient
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    Salut à toi, grunk, ô Lumière des Anciens (enfin déjà Lumière pour moi, et je t'en sais fortement gré !)

    Alors déjà, ta méthode me parle un peu plus que les looping de la librairie Volley, inaccessible à mon cerveau platement humain (et platement plat aussi faut croire).

    Un détail; Android étant une petite chose fort peu sûre d'elle, faut lui coller des try / catch à tous les étages ! Non, je sais, c'est pour notre bien....

    Donc, le code donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    public void onTokenRefresh() {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
     
            URL url = null;
            try {
                url = new URL("http://monserveur:monport/monscript.php");
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            HttpsURLConnection conn = null;
            try {
                conn = (HttpsURLConnection) url.openConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                conn.setRequestMethod("POST");
            } catch (ProtocolException e) {
                e.printStackTrace();
            }
            conn.setDoInput(true);
            conn.setDoOutput(true);
     
            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("token", refreshedToken)
                    .appendQueryParameter("autreparam", "autreparam");
            String query = builder.build().getEncodedQuery();
     
            OutputStream os = null;
            try {
                os = conn.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            BufferedWriter writer = null;
            try {
                writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            try {
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();
     
                conn.connect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    Je garde "autre param" pour l'instant, étant donné qu'il va falloir que j'enregistre l'identification de l'utilisateur. Ca pourra venir plus tard; pour l'instant j'enregistre un texte qui ne sert à rien.

    Le soucis c'est que l'appli se plante après HttpsURLConnection conn = null;
    Je n'ai aucun message à la console. Ca ressemble aux plantages que l'on obtient si une autorisation nécessaire n'est pas présent au Manifest, mais ici, j'ai INTERNET et les permissions relatives aux notifications.

    J'ai mis un break point au catch et au try suivant (conn.setRequestMethod("POST"), mais elle ne les atteint pas.

    Sans vouloir abuser de ta dispo, aurais tu une idée ?

    Merci à toi.

    PS : pour tester, j'ai remplacé HttpsURLConnection par HttpURLConnection. Là, ça ne plante plus, et le code va jusqu'au bout. Par contre, aucune réaction du côté de mon PHP, qui ne semble même pas atteint (j'ai mis un en place un enregistrement dès lors que le script est lancé, que les valeurs soient bonnes ou non, et rien ne se produit. Je pense donc qu'il n'est pas atteint).
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Quelle réponse obtiens tu coté java ?

    Pour voir le code de retour http et l’éventuel retour du script je t'invite à lire ce post qui détail l'utilisation de HttpsURLConnection

    Après je maîtrise pas trop HttpUrlConnection que je trouve assez obscur. Si une dépendance ne te fais pas peur je te conseil Apache httpClient ou OkHttp
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    J'utilise déjà le org.apache.http.legacy. C'est ce qui me sert à faire mes appels vers mes scripts PHP à partir de la main activity. Ca marche très bien, à part le fait que ça râle parce que la méthode est dépréciée (mais comme je ne suis pas de la première jeunesse non plus, ça ne me dérange pas plus que ça !).

    Cela donne : appel de la tâche (WebCnx) avec les paramètres corrects à partir de la MainActivity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private void interrogeServeur()
        //La méthode gère l'appel au serveur distant
        {
            //Mise en attente
            miseEnAttente();
     
            //Construction des paramètres d'appel
            uri = null ;
            try {
                uri = new URI( serveurWeb + scriptPhp + sql);
            } catch (URISyntaxException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            uris = new URI[]{uri};
     
            //Appel serveur distant
            connexion = new WebCnx();
            connexion.setRetourSrv(this);
            connexion.execute(uris);
        }
    ... et dans WebCnx, connexion au script (et récupération de la réponse, ce qui correspond à la majorité des usages).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    protected String doInBackground(URI... uris )
        //Fond de tâche
        {
            //Définition client web et récupération de données
            clientWeb = new DefaultHttpClient() ;
            recupWeb = new HttpGet( uris[0] ) ;
            fluxEntree = null ;
            exploitChaine = new StringBuilder() ;
     
            try
            {
                //Lecture des informations
                reponseWeb = clientWeb.execute( recupWeb ) ;
                entite = reponseWeb.getEntity() ;
                fluxEntree = entite.getContent() ;
     
                lecteurFluxEntree = new InputStreamReader( fluxEntree ) ;
                lecteurBuffer = new BufferedReader( lecteurFluxEntree ) ;
                ligneLue = null ;
     
                //Construction de la chaine exploitable
                while( (ligneLue = lecteurBuffer.readLine()) != null )
                {
                    exploitChaine.append(ligneLue) ;
                }
            }
            // Gestion des erreurs, affichage des messages concernant la connexion
            catch( Exception e )
            {
                Log.e("WebSrv", e.getMessage()) ;
            }
            finally
            {
                //Fermeture du flux après récupération
                if( fluxEntree != null )
                {
                    try
                    {
                        fluxEntree.close() ;
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            //Retour de l'information collectée
            return exploitChaine.toString() ;
        }
    Dans le cas qui me concerne, je n'ai même pas de réponse à attendre. Je me suis donc dit que j'allais appeler de la même façon ma tâche WebCnx et (si nécessaire) gérer une réponse bidon en "classement vertical" (direct poubelle).

    Sauf que : execute n'est autorisé que dans la main Activity.
    Ach, zut ! Bon, ben alors je vais transmettre à ma main Activity l'information que je reçois de mon processus FirebaseInstanceIDService, et ce sera la MainActivity qui se chargera de lancer la tâche WebCnx, vu que ça, ça marche au poil... Oui mais comment ? MainActivity et FirebaseInstanceIDService sont deux processus distincts, et comme je le disais dans mon premier message, je ne sais pas faire d'interface entre ces deux entités.

    C'est donc à partir de là que j'ai cherché une méthode, utilisable à partir de FirebaseInstanceIDService, n'utilisant pas execute. Et là, je patauge.


    Tout ça pour dire que j'ai bien org.apache.http.legacy, mais que je ne sais pas comment l'utiliser pour envoyer ma requête sans attente de réponse, à partir de FirebaseInstanceIDService (donc).

    Quant à l'autre piste, je vais m'y atteler, mais ça reste très obscur pour moi (encore plus que pour toi, j'imagine aisément !).



    .....


    Point après divers tests : en creusant ton idée de passer directement par HttpClient, j'ai refait des essais... et ça marche !

    En gros, il me suffisait (avec les bons imports bien sûr) de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clientWeb = new DefaultHttpClient() ;
    recupWeb = new HttpGet( uri ) ;
    reponseWeb = clientWeb.execute( recupWeb ) ;
    En plaçant dans uri : monserveurweb + monscriptphp + marequeteSQL (ici, je transmets l'information que je voulais enregistrer depuis le début).

    Ici, le clientWeb.execute ne pose aucun problème. Je suppose que c'était l'appel à une tâche asynchrone distincte qui posait problème auparavant...

    Bon, le seul truc, c'est que je ne gère absolument aucune réponse (pas de besoin à ce stade). Donc reponseWeb ne me sert à rien. Il n'y aurait pas une façon plus "propre" de lancer clientWeb.execute(recupWeb) ?
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    A minima ton script php devrait retourner un code HTTP 200 en cas de succès :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    header("HTTP/1.1 200 OK");
    ou un 4xx en cas d'erreur.

    Et coté java tu peux ensuite faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(reponseWeb.getStatusLine().getStatusCode() == 200)
        //TOut c'est bien passé
    else
        // gérer l'erreur
    Même si l'appel de ton script ne nécessite pas de réponse , il est bon d'avoir une information sur le bon déroulé ou non de la requête http
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    Un grand merci à toi grunk de m'avoir aidé.

    Au plaisir de te retrouver un de ces quatre, sur un autre post... et quelque chose me dit qu'il y en aura d'autres !

    Je mets le sujet en résolu.
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler fonction PHP à partir d'un lien HTML
    Par br0nsky dans le forum Langage
    Réponses: 2
    Dernier message: 12/04/2010, 21h19
  2. Comment appeler un programme PHP à partir de C++
    Par Guilbert69 dans le forum C++
    Réponses: 8
    Dernier message: 07/07/2008, 22h49
  3. Réponses: 5
    Dernier message: 07/04/2008, 14h58
  4. appel d'une fonction php à partir d'un bouton
    Par Jesmar dans le forum Langage
    Réponses: 2
    Dernier message: 27/04/2007, 19h07
  5. Contrôle d'appel d'un php à partir d'un javascript
    Par lodan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2006, 23h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo