httpclient 4.5の詳細

8617 ワード

httpclientはApacheの下のhttpネットワークアクセスを実行するためのツールバッグです.
大体の流れ:httpclientオブジェクトを新規作成します.http Requestオブジェクトを作成します.httpclientで実行します.
 
一、新しいhttp Client対象:
http Client 4.5では、初期化の方式は以前のバージョンとは少し違っています.
大体以下の方法があります.
static  CloseableHttpClient client = HttpClients.createDefault();
//    static  ,       client      ,     
 
static CloseableHttpClient httpClient=HttpClients.custom().build();
 この二つはデフォルトのhttp Clientオブジェクトを新規作成します.第二の方法では、いくつかのネットワークアクセスオプション設定を追加することができます.
/**
	 * initialize a instance of the httpClient depending on your own request
	 */
	private static CloseableHttpClient getInstanceClient() {
		CloseableHttpClient httpClient;
                StandardHttpRequestRetryHandler standardHandler = new StandardHttpRequestRetryHandler(5, true);
		HttpRequestRetryHandler handler = new HttpRequestRetryHandler() {

			@Override
			public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) {
				if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException
						|| !(arg0 instanceof SSLException) || arg0 instanceof NoHttpResponseException) {
					return true;
				}
				if (retryTimes > 5) {
					return false;
				}
				HttpClientContext clientContext = HttpClientContext.adapt(arg2);
				HttpRequest request = clientContext.getRequest();
				boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
				if (idempotent) {
					//            ,     。               
					return true;
				}
				return false;
			}
		};
		HttpHost proxy = new HttpHost("127.0.0.1", 80);//     ip
		DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
		httpClient = HttpClients.custom().setRoutePlanner(routePlanner).setRetryHandler(handler)
				.setConnectionTimeToLive(1, TimeUnit.DAYS).setDefaultCookieStore(cookieStore).build();
		return httpClient;
	}
 このコードにはそれぞれネットワークエージェントが設けられており、再試行処理は、要求されたkeepalive時間に対して、cookie storeがクッキーを保存するために指定されている.
 
 
retryHandler:コードの中で2つの方式をあげました.一つは簡単に再試行を設定するためのもので、一つ目のパラメータは最大再試行回数、二つ目のパラメータは、べき乗などの場合に再試行を要求するものです.第二の方法は、どのようなexception個が発生したかについて、再試行、及びべき乗などと再試行の回数における再試行状況を詳細に規定している.
routePlanner:http Clientは代理をサポートします.新しいhttphostオブジェクトをrouteplannerオブジェクトに転送すればいいです.httphostの構造方法では、プロキシipとポートを指定できます.
Cookie Store:cookie Storeオブジェクトを新規作成しておく必要があります.初期化方式は以下の通りです.
CookieStore cookieStore = new BasicCookieStore();
 
二、get要求を実行する:
先にコードを入れます
/**
	 * used to get the html code from the url
	 */
static RequestConfig config = RequestConfig.custom().setConnectTimeout(6000).setSocketTimeout(6000)
			.setCookieSpec(CookieSpecs.STANDARD).build(); //      cookie  
	public static String getDemo(String url) {
		HttpGet get = new HttpGet(url);
		get.setConfig(config);
		HttpResponse response = null;
		String html = null;
		try {
			response = client.execute(get);
			int statusCode = response.getStatusLine().getStatusCode();//     
			Header[] headers = response.getAllHeaders();
			//           
			for (Header header : headers) {
				System.out.println(header);
			}
			html = new String(EntityUtils.toString(response.getEntity()).getBytes("iso8859-1"), "gb2312");
			//             ,   utf-8
			//    html  ,        
			System.out.println(html);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return html;
	}
 大体の流れ:http getオブジェクトを新規作成します.http Clientで実行します.解析して返したレスポンスは自分の必要な内容を得ます.
cookie Spec:つまりクッキーポリシーです.パラメータはcookiespecsのいくつかのフィールドです.役割:1、ウェブサイトのheaderにset-cookieフィールドがある場合、デフォルトの方式でcookie rejectに書き込まれないかもしれません.この属性をCookie Specs.STANDARD_に設定します.STRICTはこの状況を避けることができます.2、クッキーアクセスを無視したいなら、Cookie Specs.IGNORE_に設定します.COOKIESです
tips:ウェブサイトのコードに注意してください.でないと文字化けが発生しやすいです.
 
三、post要求を実行する:
/**
	 * used to post form data which is the url needed
	 */
	public static void postDemo(String url) {
		HttpPost post = new HttpPost(url);
		post.setConfig(config);
		post.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36");
		post.setHeader("Connection", "keep-alive");
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		try {
			HttpEntity entity = new UrlEncodedFormEntity(list, "utf-8");
			post.setEntity(entity);
			HttpResponse response = client.execute(post);
			String responseHtml = EntityUtils.toString(response.getEntity());
			System.out.println(responseHtml);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 大まかな流れ:新規postオブジェクト->新規作成に必要なフォームページ->フォームの内容を要求に設定して実行し、レスポンスを取得します.
 
四:解析レスポンス:
入手したコード:
String responseHtml = EntityUtils.toString(response.getEntity());
 httpステータスコードを取得しました.
int statusCode = response.getStatusLine().getStatusCode();//     
 reponse headerを得る:
response.getFirstHeader("key");//         key header
			response.getHeaders("key");//      key   header,      
			response.getLastHeader("key");
 
input streamを取得しました.(インターネット部分のリソースをダウンロードする際には、cookieに要求があるかもしれません.http Clientでダウンロードする必要があります.)検証コードなどがあります.
 
InputStream inputStream = response.getEntity().getContent();
 
 
五:管理クッキー:
http Clientではcookieをデフォルトで管理していますが、cookieを抽出したい場合やカスタムクッキーを送信する場合は、http Clientオブジェクト初期化時にデフォルトのcookiestoreを設定して保存する必要があります.(方法はhttp Clientオブジェクト内のset Default Cookie Storeを初期化します).
現在のすべてのクッキーを取得:
 
List<Cookie> list = cookieStore.getCookies();// get all cookies
		System.out.println("cookie is:");
		System.out.println("-----------------------");
		for (Cookie cookie : list) {
			System.out.println(cookie);
		}
		System.out.println("-----------------------");
 すべてのクッキーをクリア:
 
 
cookieStore.clear();
 カスタムクッキーを送信します.
 
 
BasicClientCookie cookie = new BasicClientCookie("name", "value");
		// new a cookie
		cookie.setDomain("domain");
		cookie.setExpiryDate(new Date());
		// set the properties of the cookie
                cookieStore.addCookie(cookie);
 最後にaddCookieを押してcookie Storeに加入します.(同じnameのcookieがあると、hashmapのput操作に似ていると思います.)
 
 
六:管理header:
通常のキャプチャの過程では、多くのheaderを要求に追加して正常なブラウザに偽装する必要があります.サーバーに爬虫類と認識されないようにします.
いくつかのよくあるheaderを設定します.
post.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36");
		post.setHeader("Connection", "keep-alive");
いくつかのサイトのリソースをダウンロードすると、サーバーがあなたのソースステーションを取得し、対応して送信します.ソースが間違っているとサーバーに拒否されるかもしれません.この場合は要求にheaderを追加すればいいです.
get1.setHeader("Referer", "http://www.a.com");
  
 
ps:
1、爬虫類も基本法に従って、複数回の要求の中で相手のサーバーに負担をかけないようにします.
2、非英語のウェブサイトを登る時、コードフォーマットに注意してください.国内では主にutf-8としています.gb 2312もあります.取得時にトランスコードに注意してください.
3、信頼できるIP(スペアタイヤ)を多く取得し、自分のipが封鎖されたら、すぐにスペアタイヤを探してください.簡単な判断サイトが添付されていますが、代理方法が必要ですか?
//               
	private boolean isNeedProxy() {
		boolean result = true;
		URL url;
		try {
			url = new URL("http://apkpure.com/");
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setConnectTimeout(6000);
			// int i = connection.getResponseCode();
			int i = connection.getContentLength();
			if (i > 0) {
				result = false;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}