Okay, das erklärt einiges, vielen Dank!
Wenn ich das nun mit dem Stream mache, bekomme ich wieder ein Error vom Server, mit dem kann ich aber noch weniger anfangen

Erstmal der überarbeitete Code:
Delphi-Quellcode:
procedure SaveStringToStream(AStream: TStream; AString: String);
var
aStrLen: Integer;
begin
aStrLen := Length(AString);
AStream.WriteBuffer(aStrLen, SizeOf(Integer)); // <-- weglassen!
AStream.WriteBuffer(Pointer(AString)^, aStrLen);
end;
procedure TForm1.Button1Click(Sender: TObject);
var Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
SaveStringToStream(Stream,'{"id":"ID","method":"authenticate","params":{"user":"USER","password":"PASSWORD"},"jsonrpc":"2.0"}');
IdHTTP1.IOHandler:= IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.Request.ContentType:= 'application/json-rpc';
IdHTTP1.Request.Connection:= 'Keep-Alive';
Stream.Seek(0, soFromBeginning);
showmessage(IdHTTP1.Post('https://test.de/jsonrpc.do', Stream));
Stream.Free;
end;
Folgende Antwort:
Code:
{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error: Invalid UTF-32 character 0x6469227b(above 10ffff) at char #1, byte #7)"}}
Die selbe Rückmeldung bekomme ich auch wenn ich totalen Mist hinschicke.
EDIT: Okay, hab meinen Fehler gefunden. Anscheinend darf die Länge des Strings nicht im Stream gespeichert werden. Funktioniert nun super, vielen Dank Michael!