2017-02-22 68 views
-1

我試圖通過HTTP在火力地堡發送POST要求,無論是在代碼或與REST調試器,但它返回一個錯誤:德爾福 - 谷歌火力地堡 - 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

使用Chrome瀏覽器的郵遞員擴展,它的工作原理。

image

這是代碼:

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

我正在投票結束這個問題,因爲它不是用英文寫成的,而且這是一個英文網站。請在http://pt.stackoverflow.com/提問你的問題,而不是 –

+0

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

+0

設備到設備的消息發送沒有使用服務器是不可能的。 – mjn

回答

4

你的Delphi代碼未正確分配Authentication請求頭。你需要改變這一點:

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

爲了這個:

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

您應該將IdHTTP.Request.BasicAuthentication屬性設置爲false也是如此。

除此之外,因爲你設置Request.Charset屬性爲UTF-8,你應該構建TStringStream匹配:

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

隨着中說,試試下面的代碼:

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

雷米, 在您的指導下。有效! 完美! –