Box APIレスポンスヘッダーの変更
こちらでご案内しているとおり、日本時間2021年5月11日にBox APIを呼び出したときに返されるレスポンスヘッダーを変更する予定です。今回の変更により、Boxのネットワークおよび可観測性のインフラストラクチャの継続的なアップグレードの一環として、レスポンスヘッダーが常に小文字で返されるようになります。Box SDKのユーザーはこの影響を受けませんが、直接APIを利用している場合、このようなレスポンスヘッダーを使用しているかどうかやその使用方法によって影響を受ける可能性があります。
影響を受ける可能性のあるお客様にはすでにご案内していますが、お使いのBoxアプリケーションがこれらの標準に準拠しているかどうかを再度ご確認ください。以下の例では、業界のベストプラクティスやBoxのAPIドキュメントに従って、大文字と小文字を区別せずにレスポンスヘッダーをBoxから取得し、アクセスする方法を示しています。
サンプルの設定
このNode/Expressサンプルでは、Boxからアクセストークンを取得するためのAPI呼び出しを実行します。レスポンスでは、ヘッダーも取得されます。これを使用すると、プログラムのフローにも役立ちます。注意すべき重要なコードがいくつかあります。
ここでは、コンテンツタイプと長さに関するリクエストヘッダーを設定しています。これらのリクエストヘッダーは、今回のリリースによる影響を受けません。影響を受けるのはレスポンスヘッダーのみです。つまり、これらの値を設定する際に、既存のコードを変更する必要はありません。
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': req.length
}
次に、このAPIリクエストをBoxに対して実行し、レスポンスが返されたら、特定のヘッダー (Content-Type) を取得するために以下の2行を使用します。このようにAPIレスポンスヘッダーを取得して使用する部分をコード内で検索してください。ここでは、Content-Type
が大文字と小文字を区別して確認されているため、今回の影響を受ける可能性があります。
let contentType = response.headers[‘Content-Type’];
console.log(contentType);
以下のコードサンプルでは、optionsにリクエストの詳細を設定し、Boxのアクセストークンを取得するためにPOSTリクエストを送信しました。レスポンスが返されたら、エラーがないか確認し、レスポンスヘッダーを取得してから、レスポンスのパラメータからアクセストークン/有効期限を抽出します。
大文字と小文字を区別しないレスポンスヘッダーの確認への切り替え
上記 (response.headers[‘Content-Type’]
) のようにヘッダーを取得した場合、レスポンスヘッダーは大文字と小文字を区別して取得されます。ヘッダーを取得するタイミングではなく、その使用方法に注意が必要です。特定のヘッダーが存在することを予想して、その予想を基にプログラムの実行を進めた際に問題になる場合があります。
このようなヘッダーを大文字と小文字を区別せずに確認する方法は多数ありますが、その1つに、すべてのレスポンスヘッダーを強制的に大文字と小文字のいずれかに変換してから使用する方法があります。その方法は以下のとおりです。
- すべてのレスポンスヘッダーをループ処理します。
- 各ヘッダー: キー/値ペアとしてJSONオブジェクトに保存します。
- 各キー: ヘッダーキー (
Content-Type
など) を強制的に小文字に変換し、キーとして保存します。 - 各値: ヘッダー値を変更せずに保存します。
上記の手順が完了した時点で、すべてのヘッダーは標準の小文字の値に強制的に変換されているため、JSONオブジェクトで (たとえば) content-type
キーがあるかどうかを確認できます。これで、通常どおりプログラムの実行を続行し、必要な値が使用できるかどうかを確認できます。
上記のContent-Type
を確認する行を、次のように、大文字と小文字を区別しないヘッダーの確認に変更します。
上記のコードスニペットに関する注意事項がいくつかあります。
response.headers
には、レスポンス内のヘッダーがすべて含まれます。このサンプルでは、Node/Expressを使用しています。- 各ヘッダーをループ処理して、小文字のヘッダー名をキーとして新しいヘッダーオブジェクトに保存し、ヘッダー値を変更せずに保存します。レスポンスヘッダーの値では大文字と小文字が区別される場合もあれば、区別されない場合もありますが、値の大文字と小文字が区別されることが予想される場合は、値を強制的に大文字と小文字のどちらかに変換することをお勧めします。
- Nodeでは、
.toLowerCase()
を使用して強制的に小文字に変換できます。これは、前述のheader.toLowerCase()
に相当します。 - すべて小文字のヘッダーを含む新しいヘッダーオブジェクトができたら、
content-type
ヘッダーを小文字の値として問題なく使用できます。これがBoxによって返されるヘッダーであれば、値が返されます。
これは、コード内で大文字と小文字を区別せずにレスポンスヘッダーを確認する方法の一例にすぎません。これにより、将来的にアプリケーションコードの柔軟性が高まるだけでなく、HTTP標準に準拠した開発が可能になります。