相も変わらず、Javaを書き続けております。
今日は、そんな中でのお話。
公開しているサーバにファイルをアップロードするバッチ機能を実装する機会がありました。
ブラウザから呼び出すのと同じように、multipart/form-dataでリクエストを投げてファイルを登録する方式です。
Apache HttpComponents(4.2.3)を使って実装することにして、検証用サーバ(http)に対するファイルアップロードは問題なく実装できました。あ、まだ技術者としてやっていけるじゃん、俺。
本番サーバは当然のことながら通信経路の暗号化がされています。
接続先の変更のみでうまくいくことだろうとタカをくくり、余裕ぶっこいていたのですが・・・。
リクエストパラメータが、nullになってて、登録できません。
正確に言うと、ファイルデータとともに、必須項目でid的なものとか付帯情報もリクエストパラメータに乗せてたのですが、
そのidが設定されていない、とvalidationのエラーになってしまいました(ファイルデータもnull)。
そのidも、サーバに問い合わせて取得するようにしており、そこに至るまでにデータのやり取りを行っている為、
バッチ機能のリクエストがすべてnullになっているわけでもなさそうです。
前述のとおりhttpであれば問題なく動作します。また、httpsでブラウザから同じリクエストを送信しても登録できます。
SSL + multipart/form-data + HttpComponentsの時に思った通りに動かない?
頼みのgoogle先生からも有効な情報を見つけることはできませんでした。
ブラウザからのリクエストとHttpComponentsからのリクエストの差異から、
cipher suiteがAES128-SHAだったりDHE-RSA-AES256-SHAだったりしてたので、もしかして、
この辺を変えなきゃいけないの?と思って調べてみたりしたのですが、有効な情報は得られず。
ブラウザでは動作しているからApacheの設定ってわけでもなさそうだし・・・。
とまぁ、打つ手がなくなってきて「httpだけどhttpsを使っていると言い張ろう*1」とよぎりましたが、
罪悪感もあり、どこまでリクエストが来ているのか検証してみようか、と思いとどまることにしました。
その結果、
SSL + multipart/form-dataで送る時、ファイル情報だけ送れば想定通りに送れる
ことを確認。
それに対する理由を調査するのも骨が折れそうだったので*2、そうとわかれば話は早い。
1回のリクエストでファイルと登録に必要な情報を送っていた箇所を、
登録情報(POST)でSessionに格納し、その後ファイルのみ送信する(multipart/form-data)、の2回に分けて送るように修正し、思った通りに動作するようになりました。
もしかしたら、Apacheの設定とかだったんでしょうか?Javaだから嵌ったの?*3(未だに)S2使ってるから?
あの・・・誰か知っている人いたら教えてください。