Einzelnen Beitrag anzeigen

michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#5

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 14:06
Hallo,

sorry, wenn ich das Thema noch mal aufreisse, ich habe aktuell ein ähnliches Problem. Ich bekomme beim Versenden von Pushnachrichten per FCM einen "json parse error: unexcepted Character at ...". Das ist immer der erste Buchstabe des Parameters aMessage. Das Problem tritt auf, sobald mindestens ein Leerzeichen in der Message ist.

Schicke ich "Bitte ruf mal an", kommt der Fehler mit Hinweis auf den Buchstaben B.
Schicke ich "Bitterufmalan" oder "Bitte_ruf_mal_an", kommt kein Fehler und die Nachricht geht einwandfrei durch.

Meine Vermutung: Es muss irgendwas mit der Codierung der Zeichen zu tun haben. Aber ich steh hier seit heute morgen mit einem Brett vorm Kopf. Das kann nur eine Kleinigkeit sein, aber ich sehe sie nicht.

Noch ein Hinweis: Von der Firebase-Console kommen Pushnachrichten einwandfrei in meiner App an, auch wenn sie Leerzeichen beinhalten.

Hier der Quelltext der kleinen Funktion:

Code:
function PushSend(aToDeviceToken:String;aNick:String;aMessage:String):Boolean;
var
  idHTTP:tIdHTTP;
  IdIOHandler:TIdSSLIOHandlerSocketOpenSSL;
  jSonString:String;
  jSonToSend:tStringStream;
  response:String;
begin
  result:=True;
  IdHTTP := TIdHTTP.Create(nil);
  try
    IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    IdIOHandler.SSLOptions.Method := sslvSSLv23;
    IdHTTP.Request.BasicAuthentication:=False;

    IdHTTP.IOHandler := IdIOHandler;

    IdHTTP.Request.ContentType := 'application/json';
    IdHTTP.Request.Charset := 'UTF-8';
    IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'key='+MG_SERVERKey;

    jsonString := '{"to" : "'+atoDeviceToken+'",' +
                   '"data" : {' +
                   '"nick" : "'+aNick+'",' +
                   '"body" : "'+aMessage+'",' +
                   '"room" : "Testraum"' +
                   '},}';

    JsonToSend := TStringStream.Create(jsonString,TEncoding.UTF8);
    try
      response := IdHTTP.Post('https://fcm.googleapis.com/fcm/send', JsonToSend);
      response := response.Replace(#10, '');
    except
      on E: EIdHTTPProtocolException do begin
        response := e.ErrorMessage;
        result:=false;
      end;
    end;
    showmessage('Response:'+response);
  finally
    IdHTTP.Free;
  end;
Ich habe
Code:
ContentEncoding='utf-8';
auch bereits mal gesetzt.

Und ich habe den Stringstream auch schon durch einen tStream ersetzt und bin genauso vorgegangen wie in dem vorangegangenen Post. Trotzdem kommt der Fehler immer, sobald in der Message ein Leerzeichen ist.

Kann mir jemand einen Schups geben?
  Mit Zitat antworten Zitat