2017-02-22 2 views
-1

Ich versuche, eine POST Anfrage bei Firebase über HTTP zu senden, entweder im Code oder mit dem REST-Debugger, aber es gibt einen Fehler zurück:Delphi - Google Firebase - HTTP

HTTP/1.1 401 The request was missing an Authentification Key (FCM Token). Please, refer to section "Authentification" of the FCM documentation, at https=//firebase.google.com/docs

image

image

Mit der Postman-Erweiterung von Chrome funktioniert es.

image

Dies ist der Code:

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 
    IdHTTP, IdIOHandler, IdIOHandlerStream, 
    IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSSLOpenSSLHeaders_Static, 
    FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, 
    IdGlobal, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, 
    IdServerIOHandler, IdCoderMIME; 
begin 
    try 
    IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    IdIOHandler.ReadTimeout := IdTimeoutInfinite; 
    IdIOHandler.ConnectTimeout := IdTimeoutInfinite; 
    IdHTTP := TIdHTTP.Create(nil); 
    try 
     idHttp.Request.Clear; 
     idHttp.Request.CustomHeaders.Clear; 
     idHttp.Request.ContentType := 'application/json'; 
     idhttp.Request.Charset := 'UTF-8'; 
     IdHTTP.IOHandler := IdIOHandler; 
     IdHTTP.ReadTimeout := IdTimeoutInfinite; 
     IdHTTP.Request.Connection := 'Keep-Alive'; 
     IdIOHandler.SSLOptions.Method := sslvSSLv23; 
     IdHTTP.Request.Method := 'POST'; 
     IdHTTP.Request.CustomHeaders.Values['Authorization:key'] := 'AAAAYsnMbsY:APA91bEjYZK-xxxxxxx......'; 
     jsonString := '{"to" : "APA91bFJSdGW_yrX7p_TNKZ4k0OpdXTQM6xdd7BUsslk6zSvZlBmoAnfvyX-nBm4DYY-xxxxx......",' + 
        '"data" : {' + 
        '"Nick" : "Teste de Push",' + 
        '"body" : "Corpo do push",' + 
        '"Room" : "Apenas um teste"' + 
        '},}'; 
     JsonToSend := TStringStream.Create(jsonString); 
     try 
     response := IdHTTP.Post('https://fcm.googleapis.com/fcm/send', JsonToSend); 
     response := response.Replace(Char(#10), ''); 
     except 
     on E:EIdHTTPProtocolException do 
     memo1.Lines.Insert(0, e.ErrorMessage); 
     end; 
     memo1.Lines.Insert(0, response); 
    finally 
     IdHTTP.Free; 
    end; 
    finally 
    IdIOHandler.Free; 
    end; 
end; 
+2

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da es nicht auf Englisch geschrieben ist und dies eine englischsprachige Website ist. Bitte stellen Sie Ihre Frage bei http://pt.stackoverflow.com/ statt –

+0

Post em PT: http://pt.stackoverflow.com/questions/185965/delphi-google-firebase-http –

+0

Gerät-zu-Gerät Nachricht senden ist ohne die Verwendung eines Servers nicht möglich. – mjn

Antwort

4

Ihr Delphi-Code wird die Authentication Request-Header nicht korrekt zugeordnet werden. Sie müssen dies ändern:

IdHTTP.Request.CustomHeaders.Values['Authorization:key'] := 'AAAAYsnMbsY:APA91bEjYZK-xxxxxxx......'; 

Zu diesem statt:

IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'key=AAAAYsnMbsY:APA91bEjYZK-xxxxxxx......'; 

Sie das auch IdHTTP.Request.BasicAuthentication Eigenschaft auf false gesetzt ist.

Abgesehen davon, da Sie die Request.Charset Eigenschaft auf UTF-8 einstellen, sollten Sie die TStringStream konstruieren entsprechen:

JsonToSend := TStringStream.Create(jsonString, TEncoding.UTF8); 

das gesagt ist, versuchen Sie den folgenden Code:

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 
    FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, 
    IdGlobal, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, 
    IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL 
    {$IFDEF IOS} 
    , IdSSLOpenSSLHeaders_Static 
    {$ENDIF} 
    ; 

... 

begin 
    IdHTTP := TIdHTTP.Create(nil); 
    try 
    IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); 
    IdIOHandler.SSLOptions.Method := sslvSSLv23; 
    IdHTTP.IOHandler := IdIOHandler; 

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

    jsonString := '{"to" : "APA91bFJSdGW_yrX7p_TNKZ4k0OpdXTQM6xdd7BUsslk6zSvZlBmoAnfvyX-nBm4DYY-xxxxx......",' + 
        '"data" : {' + 
        '"Nick" : "Teste de Push",' + 
        '"body" : "Corpo do push",' + 
        '"Room" : "Apenas um teste"' + 
        '},}'; 
    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 
     response := e.ErrorMessage; 
    end; 
    Memo1.Lines.Insert(0, response); 
    finally 
    IdHTTP.Free; 
    end; 
end; 
+0

Remy, Mit Ihrer Anleitung. Es funktionierte! Perfekt !!! –