![]() |
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:
Danach versuche ich einen neuen Eintrag in einem Kalendar anzulegen. Aber das klappt nicht. Kann mir einer helfen? :(
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; 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; |
AW: Http.Post für die Google Calendar API ???
Ich habe mir den Code nicht angesehen, aber meinst Du wirklich, dass
Zitat:
|
AW: Http.Post für die Google Calendar API ???
müsstest Du nicht unter
![]() ein WSDL bekommen können (mir fehlen die Logginberechtigungen), welches Du unter Webservices es importieren kannst? |
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.
|
AW: Http.Post für die Google Calendar API ???
@rwachtel
oups ... sorry |
AW: Http.Post für die Google Calendar API ???
Delphi-Quellcode:
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.
// .... 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); |
AW: Http.Post für die Google Calendar API ???
Ich verstehe sowieso nicht, warum du keine JSON Komponente benutzt.
![]() 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:
PS: Und Indy Komponenten Updaten!
TStringStream.Create(slPost.Text, CP_UTF8);
|
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. |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz