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); } }