風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

getReaderとgetParamater系って一回のリクエストで同時に使えないの?

java servlet 2.4 Tomcat 5.5.28

クエリのkeyとvalueを使って応答を返すのは、まあ普通にできますわな。 HttpServletRequest#getParameterNamesを使って、keyをEnumerationで持ってきて、 それぞれにgetParameterすればいい。

で、これとは別にアクセスのログを記録しておきたいのだけれど、そのときのクエリ文字列を「来たものそのまま」保存したい。つまり順番も正しく。

GET, POSTどちらからも送られてくるので、両メソッドに対応する必要もある。

で、GETだとHttpServletRequest#getQueryString()があるので一発解決。

問題はPOSTのほう。 クエリ文字列(POSTの場合クエリとは言わないけど、便宜上)はHTTPリクエストの ボディ部分にあって、これを読む方法はHttpServletRequest#getReader。

getReaderでバッファ読み込めるっていう仕組みなんだけど、これが何かおかしい。 getParameterNamesを呼んだ後でgetReaderを呼ぶと、中身が空っぽ。 逆に、getReaderを呼んだ後でgetParameterNamesを呼ぶと、getReaderからクエリ内容は 読み込めるようになるんだけど、今度はgetParameterNamesのEnumerationが空っぽ。

javadocにはgetReaderとgetInputStreamは同時に使えないってあるけど、 もしかしてクエリ文字列に触れる可能性のあるものは全部同時使用不可?? つか同時に使えないなら例外くらい投げろよな…。

しれっと中身が空のオブジェクト返してくんじゃねえよ。 で、どうするかな…。

  • 順番が保障されるクエリの取得方法を探す。

 こういうのってたいてい受ける側は「何が来るか知っている」前提の設計だよなぁ。

  • getReaderでPOSTデータ受け取って自前でパースする
  • 実はgetReaderとgetParameterNamesは同時に使えたりすることを探す

単に俺のプログラムがヘボいだけかもしれない!!…といいな。 中身のよく分からないライブラリをドキュメントだけ頼りにするとよく起こりそうなそんなハマリ。