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タブに助けられました。
この子、大変に優秀。