Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Alternative für "request" Paket?

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Alternative für "request" Paket?

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      MartyBr @AlCalzone last edited by

      @AlCalzone Ich habe gerade Updates eingespielt und neu gestartet. Die nächste Warnung stelle ich hier ein.

      1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @MartyBr last edited by

        @MartyBr sagte in Alternative für "request" Paket?:

        Hallo, ich suche gerade eine Anleitung, wie man das Modul "request" gegen "axios" tauscht.

        Anleitungen nicht, aber eventuell hilft Dir mein diff?

        https://github.com/klein0r/ioBroker.luftdaten/commit/ee5fa18817fdc22f9bb50ee8ec26f6c8e574fd22#diff-7a9076d6d94e62c13d641aa71f19ae8e

        Oder auch

        https://github.com/klein0r/ioBroker.octoprint/commit/55a3d85f475416041eee0d5899dd0e6dccbc82e8

        Generell ist die Doku von Axios echt gut gemacht. Und ich finde es auch viel schöner damit zu arbeiten, als mit Request.

        0 klein0r committed to klein0r/ioBroker.luftdaten
        First stable release
        0 klein0r committed to klein0r/ioBroker.octoprint
        Switched to axios lib
        M 1 Reply Last reply Reply Quote 0
        • M
          MartyBr @haus-automatisierung last edited by

          @haus-automatisierung Vielen Dank. Ich habe mal versucht, ein Script umzustellen, leider erfolglos. Ich vermute nun, dass hier der Server überlastet war (Wunderground). Ich stelle mal das Intervall größer.
          Deine Doku werde ich mir mal "reinziehen". Ich gebe danacRückmeldung über die erfolgreiche Migration 😁

          1 Reply Last reply Reply Quote 0
          • X
            xawa last edited by

            Mit request hab ich kein Problem, mich an der Login Seite anzumelden und danach in eine Unterseite zu gehen um mein json abzurufen. Da ihr ja ratet zu axios zu wechseln hab ich mal einen ersten Test gewagt.

            Mit axios bekomm ich es einfach nicht hin. Die Anmeldung an der /web/login Seite klappt wunderbar, will ich jedoch dann in die Unterseite /api/client/12345678/status, dann bekomm ich immer die Meldung, dass die Anmeldung fehlgeschlagen ist. Könnt ihr mir helfen?

            const axios = require('axios');

            webLogin();

            function webLogin() {
            var API_SERVER = 'https://a-site-with-api-functions';
            var email = 'myemail';
            var password = 'mypassword';

            axios.post(API_SERVER + '/web/login', { email, password }, { withCredentials: true })
            .then(function(response) {
                    //klappt wunderbar
                     console.log('Authenticated');
                    
                    //folgendes scheitert dann an der 
                     axios.get(API_SERVER + '/api/client/12345678/status', { withCredentials: true })
            
                   }).catch(function(error) {
                     console.log('Error on Authentication');
                });
            

            }

            Hier ein Auszug aus der Fehlermeldung in der Konsole:
            _header: 'GET /api/client/27494629/status HTTP/1.1\r\n' +
            'Accept: application/json, text/plain, /\r\n' +
            'User-Agent: axios/0.21.1\r\n' +
            'Host: www.rika-firenet.com\r\n' +
            'Connection: close\r\n' +
            '\r\n',
            _keepAliveTimeout: 0,
            _onPendingData: [Function: noopPendingOutput],
            agent: [Agent],
            socketPath: undefined,
            method: 'GET',
            maxHeaderSize: undefined,
            insecureHTTPParser: undefined,
            path: '/api/client/12345678/status',
            _ended: true,
            timeoutCb: null,
            upgradeOrConnect: false,
            parser: null,
            maxHeadersCount: null,
            reusedSocket: false,
            host: 'www.rika-firenet.com',
            protocol: 'https:',
            _redirectable: [Writable],
            [Symbol(kCapture)]: false,
            [Symbol(kNeedDrain)]: false,
            [Symbol(corked)]: 0,
            [Symbol(kOutHeaders)]: [Object: null prototype]
            data: 'Authorisation required!'
            isAxiosError: true,
            toJSON: [Function: toJSON]

            1 Reply Last reply Reply Quote 0
            • X
              xawa last edited by

              Hallo Leute, zumindest bin ich bei meinem Adapter schon mal etwas weiter indem ich den Weblogin und das Holen der Values getrennt hab und zumindest keine axios Fehler bezügl. fehlerhafte Authentisierung im Log bekomme.
              Allerdings funktionieren 2 Sachen nicht:

              1.) this.log.info funktioniert in diesen try - catch Blöcken von axios nicht, sondern nur außerhalb.
              Folgendes erscheint im Log des Adapters, wenn ich mit this.log.info('') etwas reinschreiben möchte:
              (1338) TypeError: Cannot read property 'log' of undefined at /opt/iobroker/node_modules/iobroker.andi-axios/main.js:107:11 at processTicksAndRejections (internal/process/task_queues.js:97:5)
              (1338) unhandled promise rejection: Cannot read property 'log' of undefined
              Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

              Bei Matthias Kleine und seinem Luftdaten-Adapter funktioniert this.log... ja auch und ich hab hier keine besondere Definition gesehen (https://github.com/klein0r/ioBroker.luftdaten/blob/master/main.js)

              2.) wie komme ich zu meinen Values im json und wie kann ich die im Log ausgeben, damit ich zumindest mal sehe, welche Daten daherkommen?

              Anbei ein Auszug meiner main.js Weiß hier jemand Rat von euch?

              async onReady() {
              //aufruf von Weblogin 	
              await this.webLogin();
              //und danach die Werte holen
              this.getstoveValues();
              }
              
              webLogin() {
              	axios.post(API_SERVER + '/web/login', { email, password }, { withCredentials: true })
              	.then(function(response) {			
              		this.log.info('local request done'); //wird nicht ins log geschrieben
              	}).catch(function(error) {
              	  this.log.info('Error on Authentication'); //wird nicht ins log geschrieben
              	});
              }
              
              getstoveValues() {
                 axios.get(API_SERVER + '/api/client/12345678/status', { withCredentials: true, responseType: 'json' })
                 .then(function(response) {
              	const content = response.data;
              	this.log.info(JSON.stringify(content)); //wird nicht ins log geschrieben
                }).catch(function(error) {
              	this.log.error(Error); //wird nicht ins log geschrieben
                });
                this.log.info("test"); //das WIRD ins log geschrieben
              }
              AlCalzone 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @xawa last edited by

                @xawa sagte in Alternative für "request" Paket?:

                1.) this.log.info funktioniert in diesen try - catch Blöcken von axios nicht, sondern nur außerhalb.

                Das liegt an function () { ... }, hierbei wird der Wert von this nicht erhalten. Um dieses Problem zu beheben, kannst du die durch Pfeilfunktionen ersetzen.

                wie komme ich zu meinen Values im json und wie kann ich die im Log ausgeben, damit ich zumindest mal sehe, welche Daten daherkommen?

                Ich würde async/await nutzen, das umgeht auch dein Problem 1:

                async webLogin() {
                    try {
                	const response = await axios.post(API_SERVER + '/web/login', { email, password }, { withCredentials: true });
                        // in response steht jetzt die Antwort
                        // wenn du sie außerhalb der Funktion nutzen willst:
                        // return response; // oder einen Teil davon
                    } catch (e) {
                        // fehler behandeln/loggen
                    }
                }
                

                Die Funktion webLogin musst du dann auch mit await aufrufen.

                X 1 Reply Last reply Reply Quote 0
                • X
                  xawa @AlCalzone last edited by

                  Hallo AlCalzone, vielen Dank für deine Antwort. Was wären wir Änfänger ohne euch Profis.
                  webLogin funktioniert prima, allerdings bekomme ich dann einen Authentifizierungsfehler in der Funktion getstoveValues(), wenn ich das json von der Statusseite (welche ja nicht die gleiche Seite ist, bei der ich mich anmelde) abrufen will. Irgendwie scheint die Speicherung vom cookie (withCredentials: true) nicht zu funktionieren.

                  Mein Ablaufplan ist folgender und mit request (anstatt axios) funktioniert der Ablauf auch super:

                  1.) ich rufe in der onReady() vom Adapter mein webLogin() auf (webLogin und Log funktioniert jetzt prima)
                  2.) wenn weblogin nicht in catch läuft, soll getstoveValues() aufgerufen werden und die Daten vom json holen. Und da bekomme ich im Log dann: "getstoveValues: Request failed with status code 401" zurück (meine Meldung eben aus der catch - e.message)

                   async onReady() {
                      await this.webLogin();
                   }
                  
                  async webLogin() {
                  	try {
                  		const response = await axios.post(API_SERVER + '/web/login', { email, password }, { withCredentials: true });
                  		// in response steht jetzt die Antwort
                  		// wenn du sie außerhalb der Funktion nutzen willst:
                  		// return response; // oder einen Teil davon
                  		this.log.info('webLogin OK')
                  		
                  		//getstoveValues aufrufen, wenn webLogin OK
                  		await this.getstoveValues();
                  	} catch (e) {
                  		// fehler behandeln/loggen
                  		this.log.error('webLogin' + e.message);
                  	}
                  }
                  
                  async getstoveValues() {
                  	try {
                  		const response2 = axios.get(API_SERVER + '/api/client/12345678/status', { withCredentials: true })
                  		// in response steht jetzt die Antwort
                  		// wenn du sie außerhalb der Funktion nutzen willst:
                  		// return response; // oder einen Teil davon
                  		this.log.info(JSON.stringify((await response2).data));
                  	} catch (e) {
                  		// fehler behandeln/loggen
                  		this.log.error('getstoveValues: ' + e.message);
                  	}
                  }
                  

                  Viele Grüße, Andi

                  AlCalzone arteck 2 Replies Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer @xawa last edited by

                    @xawa Ehrlich gesagt weiß ich es nicht. Habe bisher nicht mit HTTP-Authentifizierung gearbeitet. Was man so im Internet findet, scheint mit deinem Ansatz übereinzustimmen...

                    X 1 Reply Last reply Reply Quote 0
                    • arteck
                      arteck Developer Most Active @xawa last edited by arteck

                      @xawa

                      const response = await axios.post(API_SERVER + '/web/login', { email, password }, { withCredentials: true });
                      

                      du musst schon angeben welche parameter was sind

                      let res = await axios.post(urlVomServer, { data: `ArrayNum=1&SeriesBatteryNum=1`});
                      

                      bei mir sind es ArraNum und SeriesBatteryNum

                      kast du geschaut was im Header gesendet wird bei login ?

                      X 1 Reply Last reply Reply Quote 0
                      • X
                        xawa @arteck last edited by

                        @arteck ich glaub, da liegt ein Missverständnis.
                        Zur Abfolge:
                        1.) Ich melde mich mit axios.post auf folgender Seite an, was auch prima funktioniert:
                        https://www.rika-firenet.com/web/login
                        2.) Danach möchte ich mit axios.get das jason abfragen, das auf folgender Seite liegt:
                        https://www.rika-firenet.com/api/client/12345678/status (12345678 ist meine OfenID, natürlich abgeändert)
                        Und genau dieser Zugriff scheitert dann an einem Authentifizierungsfehler, obwohl der vorher erfolgreiche Zugriff ja mit einem cookie zwischengespeichert werden müsste (withCredentials: true)

                        1 Reply Last reply Reply Quote 0
                        • X
                          xawa @AlCalzone last edited by

                          @AlCalzone Hab trotzdem Vielen Dank

                          1 Reply Last reply Reply Quote 0
                          • X
                            xawa last edited by

                            Vielleicht sollte ich ein eigenes Thema dazu öffnen, da es hier ja grundlegend nur um die Alternativen vom Paket "request" geht?
                            Bin doch sicher nicht der einzige, der sich per axios.post an einer Login-Seite anmeldet und per axios.get auf der API-Seite der gleichen domain ein json holen möchte.
                            Wie bereits erwähnt funktioniert es mit "request" super, da mit "const request = require('request').defaults({jar: true});" die Anmeldung für alle folgenden requests gespeichert wird, allerdings rät man ja allgemein zu axios zu wechseln.

                            AlCalzone 1 Reply Last reply Reply Quote 0
                            • AlCalzone
                              AlCalzone Developer @xawa last edited by

                              @xawa Ggf. liegt es daran, dass die Beispiele für Axios im Browser gelten, der von Haus aus Cookie-Support hat.
                              In Node.js musst du den nachrüsten:
                              https://github.com/3846masa/axios-cookiejar-support#usage

                              X 1 Reply Last reply Reply Quote 0
                              • X
                                xawa @AlCalzone last edited by

                                @AlCalzone was soll ich sagen:
                                Vielen, Vielen Dank für deine Mühe (mein Weihnachtsgeschenk)!!!
                                Genau das hat mein Problem gelöst. Anbei noch der code, vielleicht erspart es anderen genau die 2 Tage, die es mich gekostet hat.

                                Zuerst mal installieren: (später für adapter natürlich in dependencies nicht vergessen)

                                npm i axios tough-cookie axios-cookiejar-support
                                

                                in der main.js ganz oben mal alles einbinden:

                                const axios = require('axios').default;
                                const axiosCookieJarSupport = require('axios-cookiejar-support').default;
                                const tough = require('tough-cookie');
                                
                                axiosCookieJarSupport(axios);
                                const cookieJar = new tough.CookieJar();
                                

                                In der onReady() aufrufen:

                                async onReady() {
                                   await this.webLogin();
                                }
                                
                                async webLogin() {
                                	try {
                                                   //Anmelden
                                		const response = await axios.post(API_SERVER + '/web/login', { email, password }, { jar: cookieJar, withCredentials: true });
                                		// in response steht jetzt die Antwort
                                		// wenn du sie außerhalb der Funktion nutzen willst:
                                		// return response; // oder einen Teil davon
                                		this.log.info('webLogin OK')
                                		
                                		//getstoveValues aufrufen, wenn webLogin OK
                                		await this.getstoveValues();
                                	} catch (e) {
                                		// fehler behandeln/loggen
                                		this.log.error('webLogin: ' + e.message);
                                	}
                                }
                                
                                async getstoveValues() {
                                	try {
                                                   //json von API-Seite holen
                                		const response2 = await axios.get(API_SERVER + '/api/client/12345678/status', { jar: cookieJar, withCredentials: true })
                                		// in response steht jetzt die Antwort
                                		// wenn du sie außerhalb der Funktion nutzen willst:
                                		// return response; // oder einen Teil davon
                                		this.log.info(JSON.stringify(response2.data));
                                	} catch (e) {
                                		// fehler behandeln/loggen
                                		this.log.error('getstoveValues: ' + e.message);
                                	}
                                }
                                

                                Schöne Weihnachten, und nochmal vielen Dank.

                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                467
                                Online

                                31.7k
                                Users

                                79.8k
                                Topics

                                1.3m
                                Posts

                                adapter entwicklung developer development nodejs npm
                                7
                                26
                                2919
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo