API rest et Python


#1

bonjour, j’essaie d’utiliser l’API rest consumer et je suis en train d’écrire une class en python,

pour tester j’utilise le package HWMonitor mais il y a des choses que je n’arrive pas à faire comme:

– aussi je peux créer une souscription à des messages ‘SubscribeToMessage’
mais quand je fait un ‘GetMessages’, j’ai une réponse vierge (pas vu de différences )
pour ceux que ça intéresse , ci-joint le code

Est-ce que certains ont déjà essayé???
Merci

# coding: utf-8
"""
##
# @file Constellation_REST.py
# @brief module permettant d'utiliser l'API REST de Constellation
# @version 0.1
# @date 14 octobre 2016
# CREATION:
# SUCHAUD.N
# MODIFICATIONS:






Utilise l'API REST de Constellation pour accéder aux données.




Utilisation :

instantation:
o = Constellation_REST()
o.Init_Credential('828c0391715be45ade4bccb1a3e37dc7983dd9af')
o.Init_Sentinel('FR011927')
o.Init_Package('DayInfo')
 -- les valeurs passées (Credential,Sentinel,Package) avec les fonctions Init_xxx se retrouveront dans le
 header HTTP



"""


import requests
#from requests.auth import HTTPDigestAuth
import json
import inspect      # pour recuperer les args d'une fonction

"""
# Souscription à un message
url = "http://localhost:8088/rest/consumer/SubscribeToMessage?Name=NameDay"
# renvoi un ID de Souscription (subscriptionId)
r = requests.get(url, headers=headers)
if r.ok:
    subscriptionId = json.loads(r.content)
    print subscriptionId

# relever les messages  (timeout de 60s par défaut)
url = "http://localhost:8088/rest/consumer/GetMessages?subscriptionId=" + str(subscriptionId)
r = requests.get(url, headers=headers)
if r.ok:
    rep = json.loads(r.content)
    # renvoi [] si pas de changement
    print rep
"""

Cdes_Rest = {'CheckAccess':'CheckAccess?','RequestStateObjects':'RequestStateObjects?',\
    'SubscribeStateObjects':'SubscribeStateObjects?','SubscribeToMessage':'SubscribeToMessage?',\
    'GetMessages':'GetMessages?'
    }

class Constellation_REST(object):
    """
    """
    def __init__(self,IP='localhost',Port=8088):
        """
        IP : adresse ip ou nom de domaine du site
        Port : port du serveur
        """
        self.IP = IP
        self.Port = Port
        self.Headers = {}
        self.url = None

    def Init_Credential(self,AccessKey):
        """
        permet de passer l'AccessKey
        sera envoyé dans le header
        """
        self.Headers['AccessKey'] = AccessKey

    def Init_Sentinel(self,SentinelName):
        """
        permet de le nom de la sentinelle
        sera envoyé dans le header
        """
        self.Headers['SentinelName']  = SentinelName
        
    def Init_Package(self,PackageName):
        """
        permet de le nom du package
        sera envoyé dans le header
        """
        self.Headers['PackageName']  = PackageName

    def Check_Access(self):
        """
        Vérifie l'access au serveur
        @return : True si ok sinon une erreur est générée
        """
        self.Send_Get(Cdes_Rest['CheckAccess'])
        return True

    def Request_StateObject(self,SentinelName=None,PackageName=None,Name=None,Type=None):
        """
        Permet de récupérer la valeur actuelle d’un ou de plusieurs StateObjects
        @param: SentinelName: nom de la sentinelle (si None, on utilise la sentinelle initialisée
        @param: PackageName: nom du PackageName (si None, on utilise le Package initialisée
        @param: Name: nom du StateObject (si None, le paramètre ne sera pas passé)
        @param: Type: type du StateObject (si None, le paramètre ne sera pas passé)
        """
        ArgInfo =inspect.getargvalues(inspect.currentframe())
        d = self.__Convert_Args_To_Dict__(ArgInfo[3])
        cmd = o.__Construct_Cmd__('RequestStateObjects',**d)
        rep = self.Send_Get(cmd)
        return rep

    def Subscribe_StateObjects(self,SentinelName=None,PackageName=None,Name=None,Type=None):
        """
        Permet de s'abonner à la valeur actuelle d’un ou de plusieurs StateObjects
        @param: SentinelName: nom de la sentinelle (si None, on utilise la sentinelle initialisée
        @param: PackageName: nom du PackageName (si None, on utilise le Package initialisée
        @param: Name: nom du StateObject (si None, le paramètre ne sera pas passé)
        @param: Type: type du StateObject (si None, le paramètre ne sera pas passé)
        @return le subscriptionId
        """
        ArgInfo =inspect.getargvalues(inspect.currentframe())
        d = self.__Convert_Args_To_Dict__(ArgInfo[3])
        cmd = o.__Construct_Cmd__('SubscribeStateObjects',**d)
        rep = self.Send_Get(cmd)
        return rep

    def Subscribe_ToMessage(self,SentinelName=None,PackageName=None,Name=None,Type=None):
        """
        Permet de s'abonner à des messages
        @param: SentinelName: nom de la sentinelle (si None, on utilise la sentinelle initialisée
        @param: PackageName: nom du PackageName (si None, on utilise le Package initialisée
        @param: Name: nom du StateObject (si None, le paramètre ne sera pas passé)
        @param: Type: type du StateObject (si None, le paramètre ne sera pas passé)
        @return le subscriptionId
        """
        ArgInfo =inspect.getargvalues(inspect.currentframe())
        d = self.__Convert_Args_To_Dict__(ArgInfo[3])
        cmd = o.__Construct_Cmd__('SubscribeToMessage',**d)
        rep = self.Send_Get(cmd)
        return rep

    def GetMessages(self,subscriptionId,timeout=None,limit=None):
        """
        Permet de s'abonner à des messages
        @param: subscriptionId: Id de souscription
        @param: timeout:  temps maximal en milliseconde de la mise en attente de la requête (entre 1000ms et 120000ms)
        @param: limit: nombre maximum de message à retourner pour l’appel
        @return la réponse ou vide
        """
        ArgInfo =inspect.getargvalues(inspect.currentframe())
        d = self.__Convert_Args_To_Dict__(ArgInfo[3])
        cmd = o.__Construct_Cmd__('GetMessages',**d)
        print cmd
        rep = self.Send_Get(cmd)
        return rep


    def __Construct_Cmd__(self,cmd,**kwargs):
        """
        construit la commande à envoyer avec les arguments
        @param: cmd:
        @param: **kwargs: dictionnaire des arguments à passer
        @return la commande à passer
        """
        s = ""
        for arg in kwargs:
            s += arg + "=" + str(kwargs[arg]) + "&"
        return Cdes_Rest[cmd] + s[:-1]

    def __Convert_Args_To_Dict__(self,dic):
        """
        renvoi un dictionnaire dont les keys ne sont pas None
        @param: dic: dictionnaire des arguments issu de 'inspect'
        """
        d = {}
        for key in dic:
            if dic[key] != None and key != "self" and key != "frame" and key != "cmd":
                d[key]= dic[key]
        return d
        
    def Send_Get(self,cde):
        """
        envoi une commande au serveur
        @return le contenu de la réponse si OK
        """
        self.__Create_Url__(cde)
        rep = requests.get(self.url, headers=self.Headers)
        print rep
        if rep.ok:
            if (rep.content):
                return json.loads(rep.content)
            else:
                return ""
        else:
            print rep.content
            return rep.raise_for_status()

    def __Create_Url__(self,cde):
        """
        creation de l'url
        """
        self.url = "http://" + self.IP + ":" + str(self.Port) + "/rest/consumer/" + cde  

                                 
o = Constellation_REST()
o.Init_Credential('votre access code')
o.Init_Sentinel('xxxxxx')
o.Init_Package('DayInfo')
print o.Check_Access()
o.Request_StateObject(Name='NameDay')
#print o.Subscribe_StateObjects(Name='NameDay')
o.Init_Package('HWMonitor')
SubscribeId =  o.Subscribe_ToMessage(Name='/intelcpu/0/load/0')
print o.url
for i in range (5):
    print o.GetMessages(SubscribeId,timeout=5000)
    print o.Request_StateObject(Name='/intelcpu/0/load/0')



#2

C’est dingue, après la migration de l’ancien forum vers ce nouveau en cette semaine d’Avril 2018, je découvre plein de post que je n’avais pas vu ! Alors désolé pour cette réponse tardive, mieux vaut tard que jamais !

Il s’agissait d’une erreur de documentation qui a été corrigé depuis suite à un feedback sur ce même forum. La méthode est SubscribeToStateObjects et non SubscribeStateObjects