NEWS
[SOLVED] require request ersetzen durch httpPost in JS
-
ich scheiter beim Umsetzen eines "alten" request in einem Script gegen das empfohlene httpPost
(Beispielscript zum Auslesen eines FoxEss Wechselrichters)function device_realquery (SerNr) { let x='' const options= {url: domain+path_real_query, method: 'POST', headers: GetAuth (apikey,path_real_query,lang), body: '{"sn": "'+SerNr+'", "variables": []}' } log (options) request(options, function(error, response, body) {
ich muss einen header einbringen (hier zusammengebaut durch die Funktion GetAuth) und einen Body,
die Antwort ist dann in body ein Jsonwie müsste in dem Beispiel der Code für die empfolene Methode httpPost aussehen ?
Javascript Adapter V8.5.2
(Die Versuche mache ich grade auf dem Spielesystem, auf dem ich die Änderungen für das produktivsystem vorbereite. Ich kann hier also nix kaputtmachen)
Thanks, Black
-
@blackmike sagte: Ich kann hier also nix kaputtmachen
Habe zwar auch keine Ahnung, aber würde es dann mal so versuchen:
const options = { headers: GetAuth (apikey,path_real_query,lang), body: '{"sn": "'+SerNr+'", "variables": []}' }; log (options); httpPost(domain+path_real_query, options, function(error, response) {
Ergebnis in
response.data
. -
@paul53 Danke erstmal für den code, ich kann erstmal einen post absetzen
aber mit dem header das klappt so nicht, fehlermeldung der API, header ungültig (Meldung kommt auch wenn kein header vorhanden, also auskommentiert)die Gleiche funktion mit dem alten request geht aber... und da komm ich grad nicht weiter
der gültige header sähe so aus: (token xxx-ed)
headers: { 'Content-Type': 'application/json', token: 'xxxxx', lang: 'de', timestamp: '1718222454810', signature: '0a3ca762a50675917adadcb49ed272b2', 'User-Agent': 'Meiner' },
Black
-
@blackmike Hallo black,
ich hab schonmal gar keine Ahnung.
Aber wenn ich das richtig verstanden habe, hat httpGet / httpPost gar keinen body mehr.
Mag sein dass das nur für die Antwort gilt, glaube ich aber nicht.Also muss man wahrscheinlich den body im post irgendwie ersetzen.
Aber wie, so dass die Api die message versteht.
möglich dass es analog zu response.data noch ein data gibt.
Wobei die Frage bleibt, ob die API auch http post versteht
-
@blackmike Doku -> https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#httppost
httpPost( 'http://jsonplaceholder.typicode.com/posts', { title: 'foo', body: 'bar', userId: 1 }, { timeout: 2000, basicAuth: { user: 'admin', password: 'dg2LdALNznHFNo' }, headers: { 'Cookie': 'PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1' } }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } } );
-
@mcu thnx für die Doku. Ich hatte die nur für httpGet gefunden. Erste versuche sehen gut aus. Hab mir beim probieren aber irgendwas kaputtgemacht im spielesystem. Ich guck heute Abend weiter und werde berichten.
@Homoran
Die API erwartet bei dem skizzierten Aufruf ein http post. Get geht da nicht. Mit request funktionieren die Scripte ja mit "POST" auf dem Produktivsystem. Ich will nur auf dem spielesystem sucessiv die Scripte von request auf entweder httpget bzw httppost umbauen und testen und nach Validierung ins produktivsystem übernehmen.Thnx für eure Hilfestellung
Black
-
@blackmike hab inzwischen auch versucht das Konstrukt nachzuvollziehen und bei Mozilla developers und stackoverflow passende Passagen gefunden, aber mangels js Kenntnissen nicht zuordnen können was mit dem body bei httpPost passiert, der ja tatsächlich gesendet werden kann/muss.
Die Doku hatte ich leider auch nicht gefunden.
-
Dank dem Doku Link von MCU, ohne den das nicht geklappt hätte, habe ich nun den Frame, um request Posts in das neue httpPost umzusetzen.
Funktional war die Benutzung des Body sowie eigene Header.
Hat also erfolgreich geklapptDas adäquate Konstrukt schaut dann so aus:
function device_realqueryV2 (SerNr) { const body= '{"sn": "'+SerNr+'", "variables": []}' const headers={headers: GetAuth (apikey,path_real_query,lang)} httpPost (domain+path_real_query,body,headers,function (err,response) { var jdev= response.data log (response.data) }) }
Thnx für die Hilfestellung
Black
-
@blackmike sagte in require (request) ersetzen durch "httpPost" in javascript:
const body= '{"sn": "'+SerNr+'", "variables": []}'
Du kannst auch direkt ein Objekt übergeben und musst nicht so komisch JSON-Strings zusammenbauen.
function device_realqueryV2 (SerNr) { httpPost( domain + path_real_query, { sn: SerNr, variables: [] }, { headers: GetAuth(apikey,path_real_query,lang) }, (err, response) => { const data = response.data; log (data); } ); }
-
Generell gute Idee...
Aber der body MUSS ein string sein. Als json objekt bekommen ich ein Fail bei der Abfrage.
Black
-
@blackmike sagte in [SOLVED] require request ersetzen durch httpPost in JS:
MUSS ein string sein. Als json objekt
JSON ist auch einfach nur ein String.
Muss als Objekt aber auch gehen - dann macht die http-Funktion die JSON-Konvertierung für Dich.
-
Ging auch... Fehler von mir, es reichte nicht aus, nur die Aussen delimiter wegzunehmen... mit korrektem Object klappte die Abfrage
Thnx, Blck
-
Hallo Zusammen,
ich versuche auch gerade von "request" wegzukommen.
Leider scheitere ich bei httpPost um den TNES von Tasker zu erreichen.
Javascript 8.6.0Funktionierender Request:
request.post({url:'http://192.168.178.51:8765',form:{ sayit: "Sprachausgabe" }},function(error, response, body) { if (error) log(error, 'error'); });
Nicht funktionierender httpPost:
httpPost('http://192.168.178.51:8765', { sayit: "Sprachausgabe" }, { timeout: 5000 }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } });
Als Fehler kommt ein Timeout:
javascript.0 2024-06-23 11:39:32.376 error script.js.common.Sayit: timeout of 5000ms exceeded javascript.0 2024-06-23 11:39:32.375 error script.js.common.Sayit httpPost(url=http://192.168.178.51:8765, error=timeout of 5000ms exceeded)
Timeout habe ich wie ersichtlich schon testweise hochgedreht.
Liegt es evtl. am Port?Für Tipps danke ich schon einmal im Voraus.
-
@DerGraf123
Bei request gab es noch das Attribut "form". Versuche malhttpPost('http://192.168.178.51:8765', {form: {sayit: "Sprachausgabe"}}, { timeout: 5000 }, (error, response) => {
oder?
httpPost('http://192.168.178.51:8765', {form: {sayit: "Sprachausgabe"}, timeout: 5000 }, (error, response) => {
-
@paul53 Erst kommen die Post-Parameter, dann die Optionen für den Request. War also oben schon richtig.
httpPost('http://192.168.178.51:8765', { sayit: 'Sprachausgabe' }, { timeout: 5000 }, (error, response) => {
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#httppost
Im Verbose-Mode sieht man dann auch sehr gut, wie der Request zusammengebaut wird.
-
@paul53 Mit deiner Idee und dem Attribute "form" bekomme ich zwar keinen Timeout mehr, eine Sprachausgabe erfolgt aber nicht. Timeout Variable habe ich wieder rausgenommen, da 2000ms mehr als ausreichend sein sollte.
httpPost('http://192.168.178.51:8765', { form: {sayit: 'Sprachausgabe' }}, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } });
javascript.0 12:09:24.356 info script.js.common.Sayit: 200 javascript.0 12:09:24.356 info script.js.common.Sayit: <html><head><head><body><h1>Hello, World</h1></body>Header<br/>content-length : 29 remote-addr : 192.168.178.252 http-client-ip : 192.168.178.252 host : 192.168.178.51:8765 content-type : application/json connection : keep-alive accept-encoding : gzip, compress, deflate, br accept : application/json, text/plain, */* user-agent : Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0 <br/>----<br/>method = POST<br/>uri = /<br/>Params<br/>NanoHttpd.QUERY_STRING : null<br/></html> javascript.0 12:09:24.356 info script.js.common.Sayit: Object [AxiosHeaders] { 'content-type': 'text/html', date: 'Sun, 23 Jun 2024 10:09:24 GMT', connection: 'keep-alive', 'content-length': '496' }