レスポンスのデータがおかしい ⇒ 原因はキャッシュ!
WebAPIのテストでレスポンスに問題があって、以下のような状況があるとき、疑うべき原因はキャッシュアクセスだ。
①レスポンスのステータスは正常値
②レスポンスの中身(データ)はデタラメ
③サーバーのログを見ると、リクエストされた形跡がない
④サーバーを落としてリクエストすると通信エラーが発生しない。②と同じデータが返ってくる。
⑤ローカルPCでサーバーは起動していない
⑥リクエストURLをブラウザで直接指定して実行すると、期待結果が返ってくる。サーバーにリクエストログも残っている。
サーバーでは値が変わっているのに、それを取得できないことがあるってことだ。キャッシュについては、以下を参照のこと。
キャッシュメカニズムは、ブラウザからのリクエストによって得られたコンテンツをキャッシュに保持しておき、同じURLのリクエストが生じたとき、本来のWebサーバにコンテンツを取りに行かず、キャッシュの内容をブラウザに渡すものである。
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html
WebAPIでサーバーにリクエストするときは、キャッシュへのアクセスを避けること。キャッシュアクセスしてしまうと、レスポンスエラーは発生しないので一見問題なく動作しているように見える。このため、キャッシュアクセスのことに気付かないと、原因追及に時間がかかる。
キャッシュアクセスを回避するには、リクエストするときに特定のオプションを指定する。VBAなら以下のような感じ。
Set objHttp = CreateObject("MSXML2.XMLHTTP") Call objHttp.Open("GET", url, False) ' キャッシュアクセス回避 Call objHttp.setRequestHeader("Pragma", "no-cache") Call objHttp.setRequestHeader("Cache-Control", "no-cache") Call objHttp.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT") Call objHttp.send
キャッシュアクセス回避コードについては、こちらを参照のこと。
http://vird2002.s8.xrea.com/javascript/XMLHttpRequest.html
これにて、確実にサーバーへのリクエストを実行できるようになる。