fc2ブログ

記事一覧

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
}}




コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


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

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

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