【ニコニコ動画】JavaでHTTP通信

JavaでHTTP通信をお試しする上で電車検索のAPIやGoogleのAPI等、色々ありますが、
ニコニコ動画のAPIを利用してみることにしました。
まずはHTTP通信についての基礎事項を記載します。

  • HTTP通信開始
    HTTP通信を利用するには抽象クラスであるURLConnectionクラスを利用します。

    // HTTP通信接続
    URL url = new URL("http://xxx");
    HttpURLConnection httpUrlConnection = (HttpURLConnection)(url.openConnection());
    
    // HTTPS通信接続
    URL url = new URL("https://xxx");
    HttpsURLConnection httpsUrlConnection = (HttpsURLConnection)(url.openConnection());
    

    上記だけではまだサーバへの接続は開始されておらず、
    接続管理オブジェクトが生成された状態で、
    後述の「httpUrlConnection.getOutputStream()」か
    「httpUrlConnection.getInputStream()」が呼び出されると、
    内部的に「httpUrlConnection.connect()」が呼び出されます。
    切断メソッドはなく、「httpUrlConnection.getInputStream()」で取得した
    「InputStream」がcloseされるとサーバから切断されます。

  • POST通信とGET通信
    POST通信、またはGET通信を行う設定は以下の通りです。

    // POST通信
    httpUrlConnection.setRequestMethod("POST");
    httpUrlConnection.setDoOutput(true);
    
    // GET通信
    httpUrlConnection.setRequestMethod("GET");
    
  • リクエストヘッダ部の設定
    リクエストヘッダ部に値を設定する場合は以下の通りです。

    // リクエストヘッダ部設定
    httpUrlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    
  • リクエストボディ部の設定
    リクエストボディ部に値を設定する場合は以下の通りです。
    しかし、GET通信の場合、リクエストボディ部は設定しないのが正しいです。
    パラメタは「http://xxx?mail=xxxx.yyyy.zzzz@gmail.com&password=pass」で渡します。

    // リクエストボディ部に設定するパラメータ
    String params = String.format("mail=%s&password=%s", "xxxx.yyyy.zzzz@gmail.com", "pass");
    // リクエストボディ部設定
    PrintStream out = new PrintStream(httpUrlConnection.getOutputStream());
    out.print(params);
    out.close();
    
  • レスポンスボディ部の取得
    レスポンスボディ部を取得する場合は以下の通りです。

    BufferedReader responseBody = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
    String str = null;
    while((str = responseBody.readLine()) != null) {
        System.out.println(str);
    }
    responseBody.close();
    
  • レスポンスヘッダ部の取得
    レスポンスヘッダ部を取得する場合は以下の通りです。

    Map<String, List<String>> responseHeaders = https.getHeaderFields();
    Iterator<String> responseIt = responseHeaders.keySet().iterator();
    while (responseIt.hasNext()) {
        String responseKey = responseIt.next();
        List<String> responseList = responseHeaders.get(responseKey);
        for(String reponseValue: responseList) {
            System.out.println(responseKey + ":" + reponseValue);
        }
    }