少し色々調べることがあったのでまとめました.
基本
特定のURLに接続する場合の基本は以下.
URL url = new URL("https://google.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setDoInput(true); con.setRequestProperty("Content-Type", "application/json; charset=utf-8"); try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8))){ writer.write(json); } if(con.getResponseCode() == HttpURLConnection.HTTP_OK){ try(BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))){ StringBuilder builder = new StringBuilder(); String line = null; while((line = reader.readLine()) != null){ builder.append(line); } } }
URL#openConnection()
Connectionのインスタンスを呼び出しごとに新規作成します.
HttpURLConnection#setRequestMethod()
Httpのリクエストタイプを設定します.デフォルトはGETです.以下が設定可能.
GET
POST
HEAD
OPTIONS
PUT
DELETE
TRACE
HttpURLConnection#setDoOutput()
Requestボディを設定する場合,あるいは接続確率後に相手方に出力する場合に設定します.デフォルトはfalseです.
Requestボディの書き込みは以下のように,getOutputStream()に書き込むことで実現します.なので,POST時はボディが必要なので基本的にtrueとするという理解.
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8))){ writer.write(json); }
HttpURLConnection#setDoInput()
接続確率後に相手方から入力を受け取る場合に設定します.デフォルトはTrueです.
URLConnection#connect()
サイトによってこれが記載されていたり,しなかったりでどっちが正解なんだと思った方も多いと思います.
結論として,どちらも正解で,明示的に呼び出す必要は必ずしもありません.
getInputStream, getOutputStream,getResponseCodeなど,接続を前提として関数が呼び出されるときに,内部で接続が必要と判断された場合に内部的にconnect()が呼ばれて接続が開始されます.
そのため,シンプルにするためにconnect()を書かなくてもよいです.
URLConnection#getResponseCode()
HTTPのレスポンスコードを取得します.これはHTTP一般用語ですので説明は省略です.以下の記事などがまとめられていて分かりやすかったです.
HttpURLConnection#disconnect()
上記のコードでは記載しませんでしたが,finally句でdisconnect()する場合としない場合があります.
OutputStreamやInputStreamをcloseした段階でネットワークリソースは解放され,再利用されます.
一方で,disconnectまで実行した場合,HttpURLConnection#openConnectionで取得したソケットがcloseされます.disconnectしない場合は,ソケットはクローズされず他の通信で再利用される可能性があるようです.
多分これ,実際に問題にあたらないといまいち理解できない気がする.問題に直面したらもっと深く考えてみたいと思います.