GoogleCalendarAPIでデータを送るときは「contentType: 'application/json'」指定が必須!

標題のとおりなので気をつけましょう...というお話。
2時間ぐらいハマりました。

概要

GoogleCalendarAPIにjQuery Ajaxでデータの登録を試みた時に以下のようなエラーが発生。

This API does not support parsing form-encoded input.

原因

jQueryの$.ajaxを使う場合、標準でのcontentTypeは「application/x-www-form-urlencoded」になるようです。

$.ajaxのオプションに「contentType: 'application/json'」を指定すると無事に解決しました。

これまでデータ取得にしか$.ajaxを使用したことがなく、dataType: "json"とすることで受け取る際のデータはjsonとしてパースされていたので、送る時もよしなにしてくれるものだと勘違いをしていました。

正しく動作するコード

$.ajax({
    type: "POST",
    url: "https://www.googleapis.com/calendar/v3/calendars/" + targetCalendarId + "/events",
    contentType: 'application/json',
    dataType: "json",
    data: JSON.stringify({
        "description": "",
        "summary": item.summary,
        "transparency": item.transparency,
        "status": item.status,
        "start" : {"dateTime": item.start.dateTime },
        "end": {"dateTime": item.end.dateTime }
    }),
    headers: {
        'Authorization': 'Bearer ' + access_token
    }
});

普段あまり使うことの無かった、Chrome DevToolsのNetworkタブに助けられました。

この子、大変に優秀。