API für Pushnachrichten verwenden klappt nicht

23. April 2021 10:59

Hallo zusammen,

ich versuche gerade verzweifelt die API von Pushover (https://pushover.net/api) zu verwenden.

Dazu habe ich mich der Codeunit 1297 Http Web Request Mgt. bedient.

Aktuell sieht mein Code folgendermaßen aus:
Code:
HttpWebRequestMgt.Initialize('https://api.pushover.net/1/messages.json');
HttpWebRequestMgt.DisableUI;
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetReturnType('application/json');
HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
HttpWebRequestMgt.AddBodyAsText('token=MeinToken&user=MeinUser&title=Test&message=123');
TempBlob.INIT;
TempBlob.Blob.CREATEINSTREAM(InStr);
IF HttpWebRequestMgt.GetResponse(InStr,HttpStatusCode,ResponseHeaders) THEN
  MESSAGE('Gesendet');


Das ist allerdings nur die aktuelle Version. Ich habe schon versucht den Token usw. als Header zu übergeben mit HttpWebRequestMgt.AddHeader('token','MeinToken');
Oder auch den ContentType auf JSON zu ändern und den Anfragestring als JSON formatiert zu übermitteln.

Egal wie ich es drehe und wende ich bekomme immer folgenden Fehler zurück:
Fehler bei einem Aufruf von System.Net.HttpWebRequest.GetResponse mit folgender Meldung: Der Remoteserver hat einen Fehler zurückgegeben: (400) Ungültige Anforderung.

ich nutze zum Beispiel auch noch eine andere API von Labelary.com. Diese spreche ich ganz ähnlich an und diese funktioniert. Also denke ich nicht das es an der Firewall liegen kann.
Auch habe ich mir ein PowerShell Skript zum Test auf der gleichen Maschine erstellt. Auch das funktioniert.
Code:
$uri = "https://api.pushover.net/1/messages.json"
$parameters = @{
  token = "MeinToken"
  user = "MeinUser"
  message = "hello world"
}
$parameters | Invoke-RestMethod -Uri $uri -Method Post


Aktuell bin ich mit meinem Latein am Ende und weiß nicht wo ich als nächstes ansetzen könnte.

Kann mir jemand einen guten Tip geben oder hat Pushover vielleicht sogar selbst erfolgreich im Einsatz?

Viele Grüße

Re: API für Pushnachrichten verwenden klappt nicht

23. April 2021 13:08

hier mal bisl code
Code:
WebReqMgt.AddBodyAsText('{'+
'  "bla1": '    + "meins"      +','+
'  "blub1": '    + "deins"      +','+
'  "ding1": '    + "seins"  +
'}');

WebReqMgt.AddHeader('Content-Type','application/json');


sprich für dich ungefähr so;

Code:
WebReqMgt.AddBodyAsText('{'+
'  "token": '    + "MeinToken"      +','+
'  "user": '    + "MeinUser"      +','+
'  "message": '    + "hello world"  +
'}');

WebReqMgt.AddHeader('Content-Type','application/json');

Re: API für Pushnachrichten verwenden klappt nicht

26. April 2021 10:08

sweikelt hat geschrieben:sprich für dich ungefähr so;

CODE: ALLES AUSWÄHLEN
WebReqMgt.AddBodyAsText('{'+
'  "token": '    + "MeinToken"      +','+
'  "user": '    + "MeinUser"      +','+
'  "message": '    + "hello world"  +
'}');

WebReqMgt.AddHeader('Content-Type','application/json');


Danke dir für deine Rückmeldung.
Auch diese Variante hatte ich schon mal versucht. Allerdings als Einzeiler :)
Code:
HttpWebRequestMgt.AddBodyAsText('{"token": "MeinToken","user": "MeinUser","message": "Testnachricht"}');


Der Code
Code:
WebReqMgt.AddHeader('Content-Type','application/json');

funktioniert so leider nicht, den muss ich über
Code:
HttpWebRequestMgt.SetContentType('application/json');

setzen sonst bekomme ich einen Error.

Letztendlich erhalte ich leider immer noch das gleiche Ergebnis mit dem Code 400.
Und mehr Fehlerinformationen erhalte ich leider nicht. Brutal schwer hier auf die richtige Fährte zu kommen :-|

Re: API für Pushnachrichten verwenden klappt nicht

26. April 2021 12:34

Oh man...
Code:
HttpWebRequestMgt.Initialize('https://api.pushover.net/1/messages.json');
HttpWebRequestMgt.DisableUI;
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetContentType('application/json');
HttpWebRequestMgt.SetReturnType('application/json');
HttpWebRequestMgt.AddBodyAsAsciiText(
'{'+
'"token": ' + '"MeinToken"' + ',' +
'"user": ' + '"MeinUser"' + ',' +
'"message": ' + '"Testnachricht"' +
'}');

TempBlob.INIT;
TempBlob.Blob.CREATEINSTREAM(InStr);
IF HttpWebRequestMgt.GetResponse(InStr,HttpStatusCode,ResponseHeaders) THEN
  MESSAGE('Gesendet');

IF HttpStatusCode.ToString <> HttpStatusCode.OK.ToString THEN
  MESSAGE(HttpStatusCode.ToString);


So klappt es... Einzigster Unterschied -> Funktion AddBodyAsAsciiText statt AddBodyAsText verwenden.

Vielen Dank für die Hilfe!