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

Réseau/Web Python Discussion :

Serveur HTTP et JSON


Sujet :

Réseau/Web Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Serveur HTTP et JSON
    Bonjour à tous, et d'avance merci de votre attention.

    Je cherche à développer un mini serveur proxy, qui reçois en ajax un GET avec des parametres, et qui selon ces paramètres doit envoyer une réponse JSON

    J'utilise donc la classe HTTPHandler, la fonction do_GET.

    class HTTPHandler (SimpleHTTPRequestHandler):
    def do_GET(self):

    je dois envoyer la réponse suivante à mon client Javascript

    {'jsonrpc': '2.0', 'id': 'r352', 'result': 1.0}

    Or n'importe comment que j'essaie de formater la réponse, elle n'est pas acceptée correctement coté Javascript.

    Quelqu'un pourrait me mettre sur une piste ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    La réponse HTTP doit contenir la réponse, des headers et un body qui pourra être un document JSON. Si vous ne montrez pas plus de code pour voir comment vous avez codé tout çà, ce sont les seules pistes que je peux vous donner.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    La réponse HTTP doit contenir la réponse, des headers et un body qui pourra être un document JSON. Si vous ne montrez pas plus de code pour voir comment vous avez codé tout çà, ce sont les seules pistes que je peux vous donner.
    - W

    Tout d'abord merci de votre intérêt.

    Evidemment je vous propose mon code, je demande votre indulgence sur la qualité de celui ci étant débutant :-)

    Le but étant de recevoir, depuis mon client, une requête AJAX depuis un javascript qui, lorsqu'elle reçoit une réponse correctement formatée, exécute une fonction ".done".

    L'objet de la réponse est un poids récupéré sur une balance physique via le port série, mais disons que pour l'exemple on renvoie le {float} 1.5.

    Mon problème est qu'avec ce code, je me retrouve systématiquement dans le ".fail" coté Javascript.

    Un autre proxy, qui fait la même chose dans un autre contexte, renvoie un objet Json sous la forme de la réponse que je construit ci dessous, et cela fonctionne, il me manque donc de quoi, à mon avis, indiquer au Javascipt le format de la trame, ceci dit, après de multiples essais, je n'arrive pas à faire fonctionner le tout.

    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
     
     
    class HTTPHandler (SimpleHTTPRequestHandler):
        def do_GET(self):
     
            try:
                #Decoupage du GET pour obtenir les éléments de la requête
                methodName = self.path[:self.path.index('?')]
            except:
                methodName = False
     
            if methodName:
                if 'lecture_poids' in methodName:
                      response = {'jsonrpc': '2.0', 'id': 'r352', 'result': 1.5}
                      # Comment formater et renvoyer la réponse?
                      self.send_response(200, response)
     
    def main():
        try:
            httpd = HTTPServer(('', 10125), HTTPHandler)
            print 'started httpserver...'
            httpd.serve_forever()
        except KeyboardInterrupt:
            print '^C received, shutting down server'
            httpd.socket.close()
     
    if __name__ == '__main__':
        main()

    Je vous remercie par avance si vous pouviez m'indiquer comment formater ma réponse pour qu'elle soit acceptée coté JAVASCRIPT.


    MERCI !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    çà devrait donner une chose genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            if methodName:
                if 'lecture_poids' in methodName:
                      # plus facile de paramétrer la réponse avec un dict
                      dd = dict(jsonrpc='2.0', id= 'r352', result: 1.5)
                      body = json.dumps(dd) # vérifier que çà construit le JSON attendu
     
                      self.send_response(200) # status
                      self.send_header("Content-type", "application/JSON")
                      self.send_header("Content-length", len(body))
                      self.end_headers()
                      self.wfile.write(body)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci de votre aide !

    Ma réponse reste cependant incomprise coté client.

    Il me parle d'une erreur "; statement is missing".

    Lorsque je regarde une requête qui fonctionne (depuis un autre serveur), la requête est beaucoup plus complete, elle ressemble à :

    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
     
    # Content-Length	47
    # Content-Type	application/json
    # Date	Wed, 17 Apr 2013 14:19:08 GMT
    # Server	Werkzeug/0.8.1 Python/2.7.3
    # Set-Cookie	sid=b87e52846a5bea89ea84bfef625b551eee2192a5; Path=/
    # Requête
    # Accept	application/json, text/javascript, */*; q=0.01
    # Accept-Encoding	gzip, deflate
    # Accept-Language	fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    # Content-Length	69
    # Content-Type	application/json; charset=UTF-8
    # Cookie	instance0|session_id=%227155507b1d6d4532bddcff4ed9b18c3c%22; last_used_database=OPEN_TEST; sid=b87e52846a5bea89ea84bfef625b551eee2192a5
    # Host	localhost:18069
    # Referer	http://localhost:18069/?db=OPEN_TEST&ts=1366208334668
    # User-Agent	Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
    # X-Requested-With	XMLHttpRequest

    Comment remplir toutes ces informations?

    Je vous remercie sincèrement.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Ces informations peuvent être remplies en ajoutant les "self.send_header" qui vont bien. Côté programmation, ajouter des headers est simple. Savoir lesquels et quoi y mettre dépend du serveur HTTP, de l'application.

    Ma réponse reste cependant incomprise coté client.
    Il me parle d'une erreur "; statement is missing".
    Ah ben oui, mais dans quel contexte et à quoi ressemble le message reçu?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ces informations peuvent être remplies en ajoutant les "self.send_header" qui vont bien. Côté programmation, ajouter des headers est simple. Savoir lesquels et quoi y mettre dépend du serveur HTTP, de l'application.



    Ah ben oui, mais dans quel contexte et à quoi ressemble le message reçu?
    - W
    Le message ne semble pas interprété comme une réponse Javascript, lorsque je recois une réponse avec le serveur qui fonctionne, je vois bien dans Firebug une réponse formatée avec des onglets (voir pièce jointe), alors que lorsqu'il s'agit de ma réponse, j'ai un fichier sous cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HTTP/1.0 200 OK
    Server: SimpleHTTP/0.6 Python/2.7.3
    Date: Wed, 17 Apr 2013 15:25:51 GMT
    Content-type: application/json; charset='utf-8'
    Content-length: 4
     
    {'params': {'context': {}}, 'jsonrpc': '2.0', 'result': 5, 'id': 'r379'}
    Je ne comprends pas ce qui fait la difference

    Je rajoute au passage que le charset et le tableau params sont des ajouts suite à des tests de ma part mais avec ou sans cela ne change rien.

    Même en envoyant un body vide cela ne fonctionne pas d'ailleurs.
    Images attachées Images attachées  

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Comment avez vous récupéré un "Content-length: 4"
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Comment avez vous récupéré un "Content-length: 4"
    - W
    A force de faire des tests j'avais laissé une coquille, mais cela ne corrige pas pour autant le problème...

    voilà ce que j'obtiens désormais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HTTP/1.0 200 OK
    Server: SimpleHTTP/0.6 Python/2.7.3
    Date: Wed, 17 Apr 2013 16:00:48 GMT
    Content-type: application/json
    Content-length: 46
     
    {"jsonrpc": "2.0", "result": 5, "id": "r2663"}

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Ok, on a quelque chose qui ressemble à un document JSON dans une réponse HTTP. Maintenant, il faudrait regarder ce que vous appelez "JavaScript" i.e. le code qui expédie la requête et interprète la réponse.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ok, on a quelque chose qui ressemble à un document JSON dans une réponse HTTP. Maintenant, il faudrait regarder ce que vous appelez "JavaScript" i.e. le code qui expédie la requête et interprète la réponse.
    - W
    Merci pour la piste,

    L'appelant est très complexe, mais en tracant l'erreur est jetée dans la fonction suivante:

    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
    54
    55
    56
    57
    58
    59
    60
    rpc: function(url, params, options) {
            var self = this;
            options = options || {};
            // url can be an $.ajax option object
            if (_.isString(url)) {
                url = { url: url };
            }
            _.defaults(params, {
                context: this.user_context || {}
            });
            // Construct a JSON-RPC2 request, method is currently unused
            if (this.debug)
                params.debug = 1;
            var payload = {
                jsonrpc: '2.0',
                method: 'call',
                params: params,
                id: _.uniqueId('r')
            };
     
     
            var deferred = $.Deferred();
            if (! options.shadow)
                this.trigger('request', url, payload);
     
            this.rpc_function(url, payload).then(
                function (response, textStatus, jqXHR) {
     
                    if (! options.shadow)
                        self.trigger('response', response);
                    if (!response.error) {
                        deferred.resolve(response["result"], textStatus, jqXHR);
                    } else if (response.error.data.type === "session_invalid") {
                        self.uid = false;
                    } else {
                        alert('response.error' + response.error);
                        deferred.reject(response.error, $.Event());
                    }
                },
                function(jqXHR, textStatus, errorThrown) {
                    if (! options.shadow)
                        self.trigger('response_failed', jqXHR);
                    var error = {
                        code: -32098,
                        message: "XmlHttpRequestError " + errorThrown,
                        data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] }
                    };
                    alert('response_failed' + jqXHR + textStatus  + errorThrown);
                    deferred.reject(error, $.Event());
                });
            // Allow deferred user to disable rpc_error call in fail
            deferred.fail(function() {
                deferred.fail(function(error, event) {
                    if (!event.isDefaultPrevented()) {
                        self.trigger('error', error, event);
                    }
                });
            });
            return deferred;
        },
    Les "alert" sont à moi

    L'erreur est donc au niveau de la fonction function(jqXHR, textStatus, errorThrown)
    est le texte est jQuery18309617536967031574_1366216789429 was not called.

    Ca vous dit quelque chose??

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pixie99898 Voir le message
    Ca vous dit quelque chose??
    Yes - la réponse retournée ne correspond pas à ce qui est attendu par l'appelant. Le JavaScript que vous montrez a bien vécu: essayez de le simplifier (Google jquery json-rpc2 ajax pour des exemples) sinon vous avez le forum adhoc.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Yes - la réponse retournée ne correspond pas à ce qui est attendu par l'appelant. Le JavaScript que vous montrez a bien vécu: essayez de le simplifier (Google jquery json-rpc2 ajax pour des exemples) sinon vous avez le forum adhoc.
    - W

    OK, cependant je n'ai pas la main sur le code coté client! Il s'agit d'un progiciel, je ne peux pas le modifier.

    Qu'entendez vous par "la réponse retournée ne correspond pas à ce qui est attendu par l'appelant"? Ai je une chance de contourner le problème?

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par pixie99898 Voir le message
    OK, cependant je n'ai pas la main sur le code coté client! Il s'agit d'un progiciel, je ne peux pas le modifier.

    Qu'entendez vous par "la réponse retournée ne correspond pas à ce qui est attendu par l'appelant"? Ai je une chance de contourner le problème?
    Laissez tomber, je viens de trouver, je suis trop stupide, dans ma logique précédente, j'envoyais déjà une réponse qui n'avait pas lieu d'être, mon problème est résolu,

    MERCI BEAUCOUP !

Discussions similaires

  1. Sockets SSL ( serveur HTTPS )
    Par hexadecime dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 19/10/2007, 18h02
  2. [C++] Serveur HTTP
    Par taron dans le forum C++
    Réponses: 1
    Dernier message: 12/01/2006, 00h44
  3. Tester un serveur HTTP et un FTP
    Par fmcvieira dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/11/2005, 21h51
  4. [Net] Creation serveur HTTP en C++
    Par Yannos94 dans le forum C++
    Réponses: 13
    Dernier message: 14/11/2005, 12h05
  5. [Réseau] Headers vers un serveur http
    Par gexti dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 04/05/2004, 14h58

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