スポンサーリンク

HttpURLConnection

スポンサーリンク

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

基本

特定の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()

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

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

Connecting to a URL (The Java™ Tutorials > Custom Networking > Working with URLs)
This networking Java tutorial describes networking capabilities of the Java platform, working with URLs, sockets, datagrams, and cookies

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

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

URLConnection#getResponseCode()

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

HTTPステータスコード 完全に理解した - Qiita
はじめに本記事は『完全に理解した人達の「Web技術」Talk #2』にてLT発表させていただいた「HTTPステータスコード 完全に理解した」スライドの内容を書き起こしたものになります。「HTTP…

HttpURLConnection#disconnect()

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

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

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

HttpURLConnection (Java Platform SE 8)

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

タイトルとURLをコピーしました