2017-02-22 66 views
-1

Я пытаюсь отправить запрос на POST Firebase через HTTP, либо в коде или с REST Debugger, но она возвращает ошибку: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

Использование расширения Postman от 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 свойство ложным, а также.

Помимо этого, так как вы устанавливаете 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

Remy, С вашего руководства. Это сработало! Отлично !!! –