ビールとプリンとプログラミング。

頭の悪いプログラマのぼやき。

Java使ってPOSTとかやる

最近、Javaを使って、必死にHTTP通信をしようとしているんだけど色々と詰まる。




詰まる。




とりあえず、
HttpURLConnectionを使ってやってみます。


しかし、詰まる。




まあ、色々とあるんですけども。



まずは、リクエスト時のパラメータについて。




GETメソッドを使用するときはそのままだった。

URLの後に付ければいけますよね。


http://~~~~~/get?user_id=yusuke_24&field=message


的なURLオブジェクトを生成すれば、素直に行きます。
うん、見たまんま。



POSTメソッドは、というと、頭の悪い私には、そのままというわけにはいかなかったですね。

いや、よく考えたらPOSTメソッドなので、当たり前なんですけど、
どうしてもAjax通信風なPOSTを考えると、JSONチックなKey&Valueで渡して送信できればいいのに。


とか、思ってしまうんですよ。



まあ、でも、そうですよね。それじゃダメですよね。


って事で、書いてみました。

// 接続先のURL
String urlStr = "http://localhost/BeerAndPudding/app/test/print";
String paramsStr = "user_id=yusuke_24&message=今日も元気だビールがうまい!";
try {
  // URLクラスを生成
  URL createdUrl = new URL(urlStr);

  // URLクラスからコネクションを生成。HttpURLConnectionにキャスト。
  HttpURLConnection connection = (HttpURLConnection) createdUrl.openConnection();
  // HttpURLConnectionの設定。今回はPOSTメソッドの実験。
  connection.setRequestMethod("POST");
  connection.setDoOutput(true);
  connection.setRequestProperty("Content-Type", "text/plain");

  // POSTメソッドはOutputStreamを取得して書き込みを行います。
  try(OutputStream out = connection.getOutputStream();) {
    out.write(paramsStr.getBytes("UTF-8"));
  }

  // POSTしてみます。
  connection.connect();
  connection.getInputStream();

} catch(MalformedURLException e) {
  e.printStackTrace();
} catch(IOException e) {
  e.printStackTrace();
}


POSTできてることを確認するために『http://localhost/BeerAndPudding/app/test/print』なテストサーバーを起動。

こんな感じ。受け取った文字列をそのままコンソールに出してます。
f:id:yusuke_s24:20151128230720p:plain



で、送信した結果。
f:id:yusuke_s24:20151128230724p:plain



ちゃんと、送られていますね。

接続先のURLからURLオブジェクトを生成して、
そのURLオブジェクトからHttpURLConnectionオブジェクトを生成。
HttpURLConnectionの『getOutputStream』でOutputStreamを取得して、そこに書き込むんですね。

OutputStreamなんで、そこから先はいろんな方法で書き込めると思われます。


なるほど。
わかれば当たり前なんだけど、なんだかメンドウクサイナア。とも思います。




さて、
HttpURLConnectionですが、サーバーエラーが発生した時が、また厄介でした。

これ、かなり引っかかりました。


『getInputStream』したときに接続に失敗してたりすると『IOException』が発生するんですが、
エラーコードが帰ってる時も、『IOException』となるんですよね。



そーーなのーーー?



エラーコード帰ってきてても、エラーが発生するのーー?





これにわりとはまりました。


さっきのコードで接続先を『http://localhost/BeerAndPudding/app/test/print/err』に変更してみます。
接続先はというと、こんな感じ。
f:id:yusuke_s24:20151128230728p:plain



先ほどとほぼ同じですが、最後にサーバーエラーとしてリクエストをお返ししております。



結果は、、、
f:id:yusuke_s24:20151128230730p:plain


f:id:yusuke_s24:20151128230734p:plain





『IOException』が発生してます。




ほえー。



ここでキャッチして処理するしかないんですかね。





『getResponseCode』であらかじめ成功しているか、失敗しているかを取得できるので、
その辺でごにょごにょできるとは思うんだけども。





通信系は大変だなあ。

HttpURLConnectionとか普通は使わないのかしら。






もう少しHttpURLConnectionさんとは戯れる必要がありそう。