記事一覧

Bad Request 400の対処方法(Googleカレンダーで更新に失敗する原因) | REST API


今回はGoogleカレンダーを更新するプログラムを開発中に遭遇したエラーについてご紹介いたします。前回の記事でも接続時のトラブルシューティングについて掲載しましたが、接続後の更新時にも大量のエラーに遭遇しましたのでここに覚え書きします。他の誰かのお役に立てれば幸いです。


前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・C#(Xamarin)
・Google SignIn
・Google Calendar API V3


まず最初に遭遇したメッセージは
400 Bad Request
でした。それでは何が悪いのか不明ですので、httpClient.PostAsyncの戻り値を参照すると以下のようにエラーが取得されています。

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Vary: X-Origin,  Origin,Accept-Encoding
Date: Wed, 21 Jun 2017 03:49:10 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alt-Svc: quic=":443"; ma=2592000; v="38,37,36,35"
Accept-Ranges: none
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
Expires: Wed, 21 Jun 2017 03:49:10 GMT
}}


これを見るとHTTPヘッダーが良くないかのようにとらえがちですが、実際は全てjsonのフォーマット不備でした。
そこで、httpResponseMessage.Content.ReadAsStringAsync().Resultを取得することにより詳細なエラー内容が見えてきました。
以下にその詳細のケース毎にご紹介いたします。


1.NULLが含まれる場合

jsoのフィールドにNULLの値があってはいけないようです。必ず fieldName = String.Emptyで初期化しましょう。
{
 'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Invalid value for: null is not a valid value'
   }
  ],
  'code': 400,
  'message': 'Invalid value for: null is not a valid value'
 }
}


2.更新日時のフォーマット間違い

Googleカレンダーの更新日時のフォーマットは "yyyy-MM-ddTHH:mm:ss.fffZ" です。それ以外のフォーマットにして設定すると以下のように表示されます。
{
 'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Invalid value for: Invalid format: \\'2017-06-21T15:46:56Z\\' is malformed at \\'Z\\''
   }
  ],
  'code': 400,
  'message': 'Invalid value for: Invalid format: \\'2017-06-21T15:46:56Z\\' is malformed at \\'Z\\''
 }
}


3.イベント日時のフォーマット間違い

Googleカレンダーのイベント日時のフォーマットは通常のフォーマットどおり "yyyy-MM-dd" です。更新日時のフォーマットとは異なるのですね。。。
{
 'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Invalid value for: \\'T\\' found, can only parse bare date string: 2017-06-21T00:00:00+09:00 Have you accidentally used DateTime instead of a Date?'
   }
  ],
  'code': 400,
  'message': 'Invalid value for: \\'T\\' found, can only parse bare date string: 2017-06-21T00:00:00+09:00 Have you accidentally used DateTime instead of a Date?'
 }
}


4.含まれる色が違う場合

Googleカレンダーの色(背景色)はintで指定します。
System.Colorで設定した場合、以下のようなエラーとなります。
{
 'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Invalid value for: [Color: A=1, R=1, G=0.647058844566345, B=0, Hue=0.107843138277531, Saturation=1, Luminosity=0.5] is not a valid value'
   }
  ],
  'code': 400,
  'message': 'Invalid value for: [Color: A=1, R=1, G=0.647058844566345, B=0, Hue=0.107843138277531, Saturation=1, Luminosity=0.5] is not a valid value'
 }
}


5.含まれる色が違う場合 その2

Googleカレンダーの色(背景色)はintで指定します。
Stringで設定した場合、以下のようなエラーとなります。
{
'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Invalid value for: Orange is not a valid value'
   }
  ],
  'code': 400,
  'message': 'Invalid value for: Orange is not a valid value'
 }
}


6.イベント日時の型に不備がある

Googleカレンダーのベント開始日時とイベント終了日時にtimezoneなどの余計なフィールドが含まれている場合、以下のようなエラーとなります。
{
 'error': {
  'errors': [
   {
    'domain': 'global',
    'reason': 'invalid',
    'message': 'Start and end times must either both be date or both be dateTime.'
   }
  ],
  'code': 400,
  'message': 'Start and end times must either both be date or both be dateTime.'
 }
}


7.成功した場合

GoogleカレンダーをREST APIで更新した場合のリターンコードは200です。
以下のような内容となっておりました。
{StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Date: Wed, 21 Jun 2017 07:27:29 GMT
Vary: X-Origin,  Origin,Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alt-Svc: quic=":443"; ma=2592000; v="38,37,36,35"
Accept-Ranges: none
Transfer-Encoding: chunked
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Content-Type: application/json; charset=UTF-8
}}




コメント

コメントの投稿

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。