HttpURLConnection

少し色々調べることがあったのでまとめました.

基本

特定のURLに接続する場合の基本は以下.

URL url = new URL("http://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()

サイトによってこれが記載されていたり,しなかったりでどっちが正解なんだと思った方も多いと思います.

結論として,どちらも正解で,明示的に呼び出す必要は必ずしもありません.

https://docs.oracle.com/javase/tutorial/networking/urls/connecting.html

getInputStream, getOutputStream,getResponseCodeなど,接続を前提として関数が呼び出されるときに,内部で接続が必要と判断された場合に内部的にconnect()が呼ばれて接続が開始されます.

そのため,シンプルにするためにconnect()を書かなくてもよいです.

URLConnection#getResponseCode()

HTTPのレスポンスコードを取得します.これはHTTP一般用語ですので説明は省略です.以下の記事などがまとめられていて分かりやすかったです.

https://qiita.com/unsoluble\_sugar/items/b080a16701946fcfce70

HttpURLConnection#disconnect()

上記のコードでは記載しませんでしたが,finally句でdisconnect()する場合としない場合があります.

OutputStreamやInputStreamをcloseした段階でネットワークリソースは解放され,再利用されます.

一方で,disconnectまで実行した場合,HttpURLConnection#openConnectionで取得したソケットがcloseされます.disconnectしない場合は,ソケットはクローズされず他の通信で再利用される可能性があるようです.

https://docs.oracle.com/javase/jp/8/docs/api/java/net/HttpURLConnection.html

多分これ,実際に問題にあたらないといまいち理解できない気がする.問題に直面したらもっと深く考えてみたいと思います.