Java で(Web)アプリケーションから REST API を実行する時など、HTTP のクライアント機能を java.net.* から作るのは面倒です。現実的にはなんらかのライブラリを使うことになると思います。
そんな場合によく使われるのが Apache HTTP Client だと思ってます。2017/Mar/16 現在の最新バージョンは 4.5.3 でした。モジュールはこちらからダウンロードできます:
https://hc.apache.org/downloads.cgi

上記サイトの HttpClient カテゴリから 4.5.3.zip と書かれたリンクをクリックすると 4.5.3 のバイナリが zip アーカイブとして取得できます(ファイル名は httpcomponents-client-4.5.3-bin.zip)。ダウンロードした zip ファイルを展開し、lib フォルダから jar ファイル群を取り出します(今回のサンプルで最低限必要なのは以下の6ファイルです):
Eclipse 等で Java のウェブアプリケーションプロジェクトを作成し、lib フォルダ(Webcontent/WEB-INF/lib など)に上記作業で取り出した jar ファイル群をまとめてコピーしておきます。これで準備完了:

では実際にこれらのモジュールを使って HTTP アクセスを実現するプログラムを書いて実行してみます。今回はスタンドアロンに HTTP GET を実行する、こんなプログラムにしてみます:
指定した URL(上記の場合は https://www.ibm.com/developerworks/jp/")に HTTP でアクセスして、GET した結果をコンソールに出力する、というものです。この内容を記述したファイル(HttpClient1.java)を Eclipse から実行します:

で、指定した URL の HTML が取得できることを確認します。HTTP GET は呼び出すだけなのでシンプルですね:

アクセス先として HTML のようなテキストではなく、画像のようなバイナリデータの場合は以下のように byte 配列として結果を取得します(HTTP リクエストヘッダを設定する例も加えています):
一方、HTTP POST の場合も同様ですが、GET の時との違いとしてポストデータを送信する必要もあります。以下はテキスト情報とファイルのアップロードを同時に(Multipart で)送信する場合の例です:
PUT や DELETE の場合も同様に。
そんな場合によく使われるのが Apache HTTP Client だと思ってます。2017/Mar/16 現在の最新バージョンは 4.5.3 でした。モジュールはこちらからダウンロードできます:
https://hc.apache.org/downloads.cgi

上記サイトの HttpClient カテゴリから 4.5.3.zip と書かれたリンクをクリックすると 4.5.3 のバイナリが zip アーカイブとして取得できます(ファイル名は httpcomponents-client-4.5.3-bin.zip)。ダウンロードした zip ファイルを展開し、lib フォルダから jar ファイル群を取り出します(今回のサンプルで最低限必要なのは以下の6ファイルです):
- commons-codec-1.4.jar
- commons-logging-1.2.jar
- httpclient-4.5.3.jar
- httpclient-cache-4.5.3.jar
- httpcore-4.4.6.jar
- httpmime-4.5.3.jar
Eclipse 等で Java のウェブアプリケーションプロジェクトを作成し、lib フォルダ(Webcontent/WEB-INF/lib など)に上記作業で取り出した jar ファイル群をまとめてコピーしておきます。これで準備完了:

では実際にこれらのモジュールを使って HTTP アクセスを実現するプログラムを書いて実行してみます。今回はスタンドアロンに HTTP GET を実行する、こんなプログラムにしてみます:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClient1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "https://www.ibm.com/developerworks/jp/"; //. HTTP GET する URL
try{
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet( url );
CloseableHttpResponse response = client.execute( get );
int sc = response.getStatusLine().getStatusCode(); //. 200 の想定
HttpEntity entity = response.getEntity();
String html = EntityUtils.toString( entity, "UTF-8" );
System.out.println( html ); //. 取得結果をコンソールへ
client.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}
指定した URL(上記の場合は https://www.ibm.com/developerworks/jp/")に HTTP でアクセスして、GET した結果をコンソールに出力する、というものです。この内容を記述したファイル(HttpClient1.java)を Eclipse から実行します:

で、指定した URL の HTML が取得できることを確認します。HTTP GET は呼び出すだけなのでシンプルですね:

アクセス先として HTML のようなテキストではなく、画像のようなバイナリデータの場合は以下のように byte 配列として結果を取得します(HTTP リクエストヘッダを設定する例も加えています):
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClient2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "https://dw1.s81c.com/developerworks/i/f-ii-ibmbluemix.png"; //. HTTP GET する URL
try{
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet( url );
get.addHeader( "User-Agent", "MyBot/1.0" ); //. HTTP リクエストヘッダの設定
CloseableHttpResponse response = client.execute( get );
int sc = response.getStatusLine().getStatusCode(); //. 200 の想定
HttpEntity entity = response.getEntity();
byte[] img = EntityUtils.toByteArray( entity );
System.out.println( "" + img.length ); //. 取得結果をコンソールへ
client.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}
一方、HTTP POST の場合も同様ですが、GET の時との違いとしてポストデータを送信する必要もあります。以下はテキスト情報とファイルのアップロードを同時に(Multipart で)送信する場合の例です:
import java.io.File;
import java.io.FileInputStream;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClient3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "https://xxx.com/posturl"; //. HTTP POST する URL
try{
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost( url );
//. 文字情報2つとファイル1つをポスト
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody( "name", "K.Kimura", ContentType.TEXT_PLAIN );
builder.addTextBody( "email", "dotnsf@jp.ibm.com", ContentType.TEXT_PLAIN );
File f = new File( "./logo.png" );
builder.addBinaryBody( "image_file", new FileInputStream( f ), ContentType.APPLICATION_OCTET_STREAM, f.getName() );
HttpEntity multipart = builder.build();
post.setEntity( multipart );
CloseableHttpResponse response = client.execute( post );
int sc = response.getStatusLine().getStatusCode(); //. 200 の想定
HttpEntity entity = response.getEntity();
String html = EntityUtils.toString( entity, "UTF-8" );
System.out.println( html ); //. 取得結果をコンソールへ
client.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}
PUT や DELETE の場合も同様に。
