2017-02-22 136 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

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