読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

httpclient-4.3.1を使って、プロキシ越えでHTTPリクエストするサンプル。HTTPS(443ポート)でリクエストを飛ばすサンプルも。

<スポンサーリンク>

今日は年末の飲みの影響で、若干酔っているので、サンプルだけ(読んでくれてる人には関係ないと思うけど、ごめんなさい)
サンプルはちゃんと動きます。

まずは、プロキシなしでリクエストする場合のサンプル。

package sample.http;

import java.io.InputStream;

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;

public class SimpleHttpGetExample {
	public static void main(String[] args) throws Exception {
		printBody ("http://www.yahoo.co.jp/");
	}

	public static void printBody(String url) throws Exception {
		CloseableHttpClient httpclient = HttpClients.createDefault();
		try {

			HttpGet httpget = new HttpGet(url);
			System.out.println("HTTPリクエストを飛ばします:"  + httpget.getURI());
			CloseableHttpResponse response = httpclient.execute(httpget);

			try {
				System.out.println("レスポンスコード→" + response.getStatusLine());

				HttpEntity entity = response.getEntity();

				if (entity != null) {
					InputStream in = entity.getContent();
					char c;
					int i;
					try {
						while ((i = in.read()) != -1) {
							c = (char)i;
							System.out.print(c);
						}
						in.read();

					} finally {
						in.close();
					}
				}
			} finally {
				response.close();
			}
		} finally {
			httpclient.close();
		}

	}
}

Yahooのページのタグがブワーッとコンソールにでてきます。

今度はプロキシ越えでリクエストを飛ばすパターン。

package sample.http.proxy;

import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpRequestViaProxyExample {

	private static String proxyHost = "hoge.proxy";
	private static int proxyPort = 88;
	private static String proxyUser = "myuser";
	private static String proxyPass = "mypass";

	private static String protcol = "https";
	private static String targetHost = "www.google.com";
	private static int port = 443;

	public static void main(String[] args) throws Exception {
		printContent(targetHost, port, protcol);
	}

	public static void printContent(String host, int port, String protcol) throws Exception {
		CredentialsProvider credsProvider = new BasicCredentialsProvider();
		credsProvider.setCredentials(
				new AuthScope(proxyHost,proxyPort),
				new UsernamePasswordCredentials(proxyUser,proxyPass));
		CloseableHttpClient httpclient = HttpClients.custom()
				.setDefaultCredentialsProvider(credsProvider).build();

		try {
			HttpHost targetHost = new HttpHost(host, port, protcol);
			HttpHost proxy = new HttpHost(proxyHost, proxyPort);

			RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
			HttpGet httpget = new HttpGet("/");
			httpget.setConfig(config);

			System.out.println("リクエスト⇒" + httpget.getRequestLine());
			System.out.println("プロキシ⇒" + proxy);
			System.out.println("接続先⇒" + targetHost);
			CloseableHttpResponse response = httpclient.execute(targetHost, httpget);

			try {
				HttpEntity entity = response.getEntity();
				System.out.println("ステータスライン" + response.getStatusLine());
				if (entity != null) {
					InputStream in = entity.getContent();
					char c;
					int i;
					try {
						while ((i = in.read()) != -1) {
							c = (char)i;
							System.out.print(c);
						}
						in.read();

					} finally {
						in.close();
					}
				}
			} finally {
				response.close();
			}
		} finally {
			httpclient.close();
		}

	}
}

これを実行したら、プロキシ経由でHTTPSリクエストを飛ばして、Webページの内容を取得することができる。