Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Http.Post für die Google Calendar API ??? (https://www.delphipraxis.net/170540-http-post-fuer-die-google-calendar-api.html)

bodycounter 21. Sep 2012 19:36

Delphi-Version: 2009

Http.Post für die Google Calendar API ???
 
Hallo.

Ich versuche die ganze Zeit ein HTTP POST für die Google Calendar API zu basteln.
Aber es will nicht funktionieren. Ich kann mich einloggen und mit HTTP GET die Kalender Liste bekommen.
Und zwar so:

Delphi-Quellcode:
TGoogleCalender = record
   etag,id,summary,description: string;
  end;
  TGoogleCalenderArray = array of TGoogleCalender;
var
    calenderList : TGoogleCalenderArray;
const
    apikey = 'AIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXE';


procedure TFormMain.Button1Click(Sender: TObject);
const
    baseURLlogin : string = 'https://www.google.com/accounts/ClientLogin';
    baseURLcalendars : string = 'https://www.googleapis.com/calendar/v3/users/me/calendarList';
var
    stringStream: TStringStream;
    slPost, slReply: TStringList;
    sPostResult: string;
    sGetResult: string;
    authCode : string;
    item : integer;
    I: Integer;

begin
    slPost := TStringList.Create;
    slReply := TStringList.Create;
    try
        slPost.LineBreak := '&';
        slPost.Values['Email'] := 'XXXXXXX@gmail.com';
        slPost.Values['Passwd'] := 'XXXXX';
        slPost.Values['service'] := 'cl';
        slPost.Values['source'] := 'Test';

        stringStream := TStringStream.Create(slPost.Text);
        try
            IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
            sPostResult := IdHTTP1.Post(baseURLlogin, stringStream);

            slReply.LineBreak:=#10;
            slReply.Text:=sPostResult;
            authCode:=slReply.Values['auth'];
            slReply.LineBreak:=#13#10;
            if pos('200 OK',IdHTTP1.ResponseText)>0 then
            begin
                IdHTTP1.Request.CustomHeaders.FoldLines:=false;
                IdHTTP1.Request.CustomHeaders.Clear;
                IdHTTP1.Request.CustomHeaders.Values['Authorization']:='GoogleLogin auth=' + authCode;
                IdHTTP1.Request.ContentType := 'application/atom+xml';
                sGetResult :=IdHTTP1.Get(baseURLcalendars+'?minAccessRole=writer&key='+apikey);

                calenderList := getCalenders(sGetResult);
                for I := 0 to length(calenderList) - 1 do
                begin
                    ComboBox1.Items.Add(calenderlist[I].summary);
                end;
                ComboBox1.ItemIndex := 2;
            end;
    finally
      stringStream.Free;
    end;
    finally
        slPost.Free;
        slReply.Free;
    end;
end;
Danach versuche ich einen neuen Eintrag in einem Kalendar anzulegen. Aber das klappt nicht. Kann mir einer helfen? :(
DANKE

Delphi-Quellcode:
procedure TFormMain.Button2Click(Sender: TObject);
const
    baseURLevent : string = 'https://www.googleapis.com/calendar/v3/calendars/CID/events?key=APIKEY' ; // replace CID and APIKEY
var
    slPost : TStringList;
    stringStream: TStringStream;
    postResult : string;
    URLevent : string;
begin
    slPost := TStringList.Create;
    slPost.LineBreak := '';
    slPost.Add('{');
    slPost.Add('"end": {');
    slPost.Add('"dateTime": "'+formatdatetime('yyyy-mm-dd"T"hh:mm:ss',now)+'",');
    slPost.Add('"timeZone": "Europe/Berlin"');
    slPost.Add('},');
    slPost.Add('"start": {');
    slPost.Add('"dateTime": "'+formatdatetime('yyyy-mm-dd"T"hh:mm:ss',now+5)+'",');
    slPost.Add('"timeZone": "Europe/Berlin"');
    slPost.Add('},');
    slPost.Add('"description": "Hier ist die Beschreibung",');
    slPost.Add('"summary": "Das hier ist der Title",');
    slPost.Add('"colorId": "6",');
    slPost.Add('"reminders": {');
    slPost.Add('"overrides": [');
    slPost.Add('{');
    slPost.Add('"method": "popup",');
    slPost.Add('"minutes": 1440');
    slPost.Add('},');
    slPost.Add('{');
    slPost.Add('"method": "email",');
    slPost.Add('"minutes": 720');
    slPost.Add('}');
    slPost.Add('],');
    slPost.Add('"useDefault": false');
    slPost.Add('}');
    slPost.Add('}');

    stringStream := TStringStream.Create(slPost.Text);
    IdHTTP1.Request.ContentType := 'application/json';

    URLevent := baseURLevent;
    URLevent := StringReplace(URLevent,'CID',calenderList[ComboBox1.ItemIndex].id,[]);
    URLevent := StringReplace(URLevent,'APIKEY',apikey,[]);

    postResult := IdHTTP1.POST(URLevent, stringStream);
    // Hier kommt dann der Fehler
end;

rwachtel 21. Sep 2012 20:35

AW: Http.Post für die Google Calendar API ???
 
Ich habe mir den Code nicht angesehen, aber meinst Du wirklich, dass
Zitat:

Zitat von bodycounter (Beitrag 1183925)
[...] Aber das klappt nicht. [...|

eine hinreichend detaillierte Fehlerbeschreibung darstellt? :wall:

Bummi 21. Sep 2012 21:30

AW: Http.Post für die Google Calendar API ???
 
müsstest Du nicht unter
http://www.google.com/calendar/feeds/default
ein WSDL bekommen können (mir fehlen die Logginberechtigungen),
welches Du unter Webservices es importieren kannst?

rwachtel 21. Sep 2012 21:44

AW: Http.Post für die Google Calendar API ???
 
Die (hier auch verwendete) Google Calendar API v3 basiert auf REST, da werden wir ein WSDL lange suchen. Ältere Inkarnationen dieser API gelten als deprecated.

Bummi 21. Sep 2012 21:52

AW: Http.Post für die Google Calendar API ???
 
@rwachtel

oups ... sorry

sx2008 22. Sep 2012 00:41

AW: Http.Post für die Google Calendar API ???
 
Delphi-Quellcode:
// .... dutzende kryptische slPost.Add() Befehle
slPost.Add('"useDefault": false');
slPost.Add('}');
slPost.Add('}');

// und jetzt, TADA, einfach mal als Datei abspeichern um auf einen Blick zu sehen
// ob man oben einen Fehler gemacht hat
slPost.SaveToFile('C:\postdata.txt');

stringStream := TStringStream.Create(slPost.Text);
Wenn es ein Problem mit irgendeiner Art von Kommunikation gibt, sei es HTTP oder Daten über eine serielle Schnittstelle, dann speichert man die Daten in eine Datei und schaut sich das mit einem Text- oder Hexeditor an.

geskill 22. Sep 2012 00:57

AW: Http.Post für die Google Calendar API ???
 
Ich verstehe sowieso nicht, warum du keine JSON Komponente benutzt. http://sourceforge.net/projects/lkjson/

Und beim POST Request bist du sicher, dass in den CustomHeaders immer noch die "Authorization" steht?

Google meldet standardmäßig über den Response Code und den 'Quellcode' der zurück kommt eine gute Fehlermeldung!

Statt:
Delphi-Quellcode:
TStringStream.Create(slPost.Text);

Lieber direkt so (sonst hast du nachher nur Ärger mit Sonderzeichen):
Delphi-Quellcode:
TStringStream.Create(slPost.Text, CP_UTF8);
PS: Und Indy Komponenten Updaten!

bodycounter 25. Sep 2012 11:30

AW: Http.Post für die Google Calendar API ???
 
So. Ich habe meinen Fehler gefunden.
Das Enddate war vor dem Startdate.

Blöder fehler ...
ich hab es oben korrigiert, Falls jemand auch noch einen schnellen Weg zum Event erzeugen braucht.

bodycounter 25. Sep 2012 11:37

AW: Http.Post für die Google Calendar API ???
 
Ich wollte den Quelltext oben ändern, habe aber keine Möglichkeit gefunden, ihn zu ändern.
Geht das überhaupt :?:


Hier die Änderungen:
Zitat:

Zitat von bodycounter (Beitrag 1183925)
Delphi-Quellcode:
    slPost.Add('"dateTime": "'+formatdatetime('yyyy-mm-dd"T"hh:mm:ss',now+5)+'",');
    slPost.Add('"dateTime": "'+formatdatetime('yyyy-mm-dd"T"hh:mm:ss',now)+'",');
    stringStream := TStringStream.Create(slPost.Text,CP_UTF8);



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz