Faraday middlewareのjsonとretryの順番
Faraday gemでmiddlewareを並べるとき、json middlewareはretry middlewareより上に置いておくと便利。
Faraday middlewareは、requestでは上から順番に、responseでは下から順番に処理されることになっています。
https://lostisland.github.io/faraday/#/middleware/index に書かれている図を参照。
実装としてはmiddlewareのcallがネストしている形
https://github.com/lostisland/faraday/blob/bbaa093dbc629b697ce4b6dee4cd882d0eef80d1/lib/faraday/middleware.rb#L54-L62
ここでretry middlewareではwith_retriesで子のcall全体を囲う形で実装されています。
https://github.com/lostisland/faraday-retry/blob/10ec1da9de497c80d1b7d1de2cb11709398b8013/lib/faraday/retry/middleware.rb#L163-L175
したがってretryより下にjsonがいると、リトライするかどうかの判断より先にbodyのデコードが始まります。
つまり、何かしらのエラー時にresponse bodyがJSONでエンコードされていなかった場合、リトライされるより先にJSONデコードのエラーが出ます。JSONデコードのエラーでリトライするような設定になっていなかった場合、このままリトライされずにエラーがraiseされる流れとなります。
このためretryより上にjsonを置いておくと、先にリトライするかどうかの判断をして、その後デコードを考えるという流れになります。
そうするとretry middlewareはrequest middlewareというよりかはresponse middlewareと思った方が分かりやすいのかもしれませんね。
#ruby