I’m trying to add an event to Google Calendar from within a test console app.
I have a token_refresh obtained for the scope “https://www.googleapis.com/auth/calendar” via a web application that I registered at the Google API Console.
I use this stored token_refresh in my test console app to get an access_token.
Then I want to add an event to the calendar of the user that corresponds to the refresh_token that I have.
So I build a POST HttpWebRequest as follows:
HttpWebRequest request = WebRequest.Create("https://www.googleapis.com/calendar/v3/calendars/" + calendarID + "/events") as HttpWebRequest; // Where calendarID is like joe@gmail.com
request.Headers.Add("Authorization", "Bearer " + access_token);
request.Headers.Add("Accept-Charset", "UTF-8");
request.Headers.Add("ContentType", "application/json");
request.ProtocolVersion = HttpVersion.Version11;
request.KeepAlive = false;
request.Method = "POST";
GoogleCalendarEvent anEvent = new GoogleCalendarEvent();
anEvent.start = new GoogleCalendarEventTime(DateTime.Today);
anEvent.end = new GoogleCalendarEventTime(DateTime.Today);
string data = jsonSerializer.Serialize(anEvent); // jsonSerializer is a JavaScriptSerializer object
byte[] postData = Encoding.UTF8.GetBytes(data);
Stream ws = request.GetRequestStream();
ws.Write(postData, 0, postData.Length);
ws.Close();
WebResponse response = request.GetResponse(); // throws WebException The remote server returned an error: (400) Bad Request.
stream = new StreamReader(response.GetResponseStream());
string result = stream.ReadToEnd().Trim();
And the helper classes are:
private class GoogleCalendar
{
private string kind;
private string etag;
private string id;
private string summary;
private string timezone;
private string accesrole;
public string Kind
{
get { return this.kind;}
set { this.kind = value; }
}
public string Etag
{
get { return this.etag; }
set { this.etag = value; }
}
public string ID
{
get { return this.id; }
set { this.id = value; }
}
public string Summary
{
get { return this.summary; }
set { this.summary = value; }
}
public string TimeZone
{
get { return this.timezone; }
set { this.timezone = value; }
}
public string AccessRole
{
get { return this.accesrole; }
set { this.accesrole = value; }
}
}
private class GoogleCalendarEventTime
{
private DateTime _date;
public string date
{
get
{
return this._date.ToString("yyyy-mm-dd");
}
}
public GoogleCalendarEventTime(DateTime time)
{
this._date = time;
}
}
My problem is that when the I try to get a response for the request I get an Error 400 Bad request. This type of error code is for both when a POST is badly constructed and as a placeholder for unknown errors.
Google provides a client library for .NET, which will make this much easier for you. An explanation of how to configure the client library with the Calendar API is available here (click the .NET tab on that page).
This line constructs the service object which you will use to make API calls:
Unfortunately, there aren’t comprehensive samples for using .NET with all of the API methods of the Calendar API, but you can see a list of all the APIs supported by this client library, many of which have examples. The usage pattern will be nearly identical across the APIs.