生活随笔
收集整理的這篇文章主要介紹了
HttpClient学习系列 -- 学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
jar包:
?HttpClient?4.x版本
?
簡要介紹
HttpComponents 包括 HttpCore包和HttpClient包
HttpClient:Http的執行http請求
DefaultHttpClient:httpClient默認實現
HttpGet、HttpPost:Get、Post方法執行類
HttpResponse:執行返回的Response,含http的header和執行結果實體Entity
HttpEntity:Http返回結果實體,不含Header內容
HttpParam:連接參數,配合連接池使用
PoolingClientConnectionManager:連接池
?
基礎Get方法
Java代碼 ?
HttpClient?client?=?new?DefaultHttpClient();??HttpGet?get?=?new?HttpGet(url);??HttpResponse?response?=?client.execute(get);??HttpEntity?entity?=?response.getEntity();??if?(entity?!=?null)?{??????System.out.println(?entity.getContentEncoding());??????System.out.println(?entity.getContentType());??????????InputStream?instream?=?entity.getContent();??????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(instream,?encoding));??????System.out.println(reader.readLine());??????????}????client.getConnectionManager().shutdown();?? ?
?
基礎Post方法
?
Java代碼 ?
????DefaultHttpClient?httpclient?=?new?DefaultHttpClient();??????HttpPost?httpost?=?new?HttpPost(url);??????????List<NameValuePair>?formparams?=?new?ArrayList<NameValuePair>();??????formparams.add(new?BasicNameValuePair("p",?"1"));??????formparams.add(new?BasicNameValuePair("t",?"2"));??????formparams.add(new?BasicNameValuePair("e",?"3"));????????UrlEncodedFormEntity?urlEntity?=??new?UrlEncodedFormEntity(formparams,?"UTF-8");??????httpost.setEntity(urlEntity);????????HttpResponse?response?=?httpclient.execute(httpost);??????HttpEntity?entity?=?response.getEntity();????????System.out.println("Login?form?get:?"?+?response.getStatusLine()?+?entity.getContent());??????System.out.println("Post?logon?cookies:");??????List<Cookie>?cookies?=?httpclient.getCookieStore().getCookies();??????for?(int?i?=?0;?i?<?cookies.size();?i++)?{??????????System.out.println("-?"?+?cookies.get(i).toString());??????}??????????httpclient.getConnectionManager().shutdown();?? ?
?
保留Session,保留用戶+密碼狀態
Demo1,只支持單線程
?
Java代碼 ?
DefaultHttpClient?httpclient?=?new?DefaultHttpClient(??????new?ThreadSafeClientConnManager());????HttpPost?httpost?=?new?HttpPost(url);??List<NameValuePair>?formparams?=?new?ArrayList<NameValuePair>();??formparams.add(new?BasicNameValuePair("p",?"1"));??formparams.add(new?BasicNameValuePair("t",?"2"));??formparams.add(new?BasicNameValuePair("e",?"3"));??httpost.setEntity(new?UrlEncodedFormEntity(formparams,?Consts.UTF_8));??httpclient.execute(httpost);??httpost?=?new?HttpPost(url2);??BasicResponseHandler?responseHandler?=?new?BasicResponseHandler();??System.out.println(httpclient.execute(httpost,?responseHandler));??httpclient.getConnectionManager().shutdown();????return?"";?? ?
?
?
Demo2:第二次請求帶上第一次請求的Cookie?
? ? 用于在用戶+密碼等候后,后續根據第一次請求的URL獲取的Cookie,把這些Cookie添加到第二次請求的Cookie中
?
?
Java代碼 ?
DefaultHttpClient?httpclient?=?new?DefaultHttpClient();??????????HttpPost?httpost?=?new?HttpPost(url);??????????????????List<NameValuePair>?formparams?=?new?ArrayList<NameValuePair>();??????????formparams.add(new?BasicNameValuePair("uname",?name));??????????formparams.add(new?BasicNameValuePair("pass",?"e0c10f451217b93f76c2654b2b729b85"));??????????formparams.add(new?BasicNameValuePair("auto_login","0"));??????????formparams.add(new?BasicNameValuePair("a","1"));??????????formparams.add(new?BasicNameValuePair("backurl","1"));?????????????UrlEncodedFormEntity?urlEntity?=??new?UrlEncodedFormEntity(formparams,?"UTF-8");??????????httpost.setEntity(urlEntity);??????????HttpContext?localContext?=?new?BasicHttpContext();????????????HttpResponse?response?=?httpclient.execute(httpost,localContext);??????????HttpEntity?entity?=?response.getEntity();??????????????????System.out.println(Arrays.toString(response.getAllHeaders()));??????????System.out.println(EntityUtils.toString(entity));?????????????????????DefaultHttpClient?httpclient2?=?new?DefaultHttpClient();??????????HttpPost?httpost2?=?new?HttpPost("http://my.ifeng.com/?_c=index&_a=my");??????????????????CookieStore?cookieStore2?=?httpclient2.getCookieStore();??????????????????CookieStore?cookieStore?=?httpclient.getCookieStore();??????????List<Cookie>?list?=?cookieStore.getCookies();??????????for(Cookie?o?:?list){??????????????System.out.println(o.getName()?+?"?=?"?+?o.getValue()?+?"?12");;??????????????cookieStore2.addCookie(o);??????????}?????????????HttpResponse?response2?=?httpclient2.execute(httpost2);??????????HttpEntity?entity2?=?response2.getEntity();??????????System.out.println(Arrays.toString(response2.getAllHeaders()));??????????System.out.println(EntityUtils.toString(entity2));?? ?
?
?
獲取訪問上下文:
?
?
Java代碼 ?
HttpClient?httpclient?=?new?DefaultHttpClient();??HttpGet?get?=?new?HttpGet(url);??HttpContext?localContext?=?new?BasicHttpContext();??httpclient.execute(get,?localContext);????HttpConnection?con?=?(HttpConnection)?localContext??????????.getAttribute(ExecutionContext.HTTP_CONNECTION);??System.out.println("socket超時時間:"?+?con.getSocketTimeout());????HttpHost?target?=?(HttpHost)?localContext??????????.getAttribute(ExecutionContext.HTTP_TARGET_HOST);??System.out.println("最終請求的目標:"?+?target.getHostName()?+?":"??????????+?target.getPort());????HttpHost?proxy?=?(HttpHost)?localContext??????????.getAttribute(ExecutionContext.HTTP_PROXY_HOST);??if?(proxy?!=?null)??????System.out.println("代理主機的目標:"?+?proxy.getHostName()?+?":"??????????????+?proxy.getPort());????System.out.println("是否發送完畢:"??????????+?localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));????HttpRequest?request?=?(HttpRequest)?localContext??????????.getAttribute(ExecutionContext.HTTP_REQUEST);??System.out.println("請求的版本:"?+?request.getProtocolVersion());??Header[]?headers?=?request.getAllHeaders();??System.out.println("請求的頭信息:?");??for?(Header?h?:?headers)?{??????System.out.println(h.getName()?+?"--"?+?h.getValue());??}??System.out.println("請求的鏈接:"?+?request.getRequestLine().getUri());????HttpResponse?response?=?(HttpResponse)?localContext??????????.getAttribute(ExecutionContext.HTTP_RESPONSE);??HttpEntity?entity?=?response.getEntity();??if?(entity?!=?null)?{??????System.out.println("返回結果內容編碼是:"?+?entity.getContentEncoding());??????System.out.println("返回結果內容類型是:"?+?entity.getContentType());??}?? ?
?
?
?
連接池和代理:
? ?每次使用最后一句new DefaultHttpClient(cm, httpParams);獲取新的HttpClient
? ?里面還有一條如何設置代理
?
Java代碼 ?
????????????????HttpParams?httpParams??=?new?BasicHttpParams();?????????????????????????????HttpConnectionParams.setConnectionTimeout(httpParams,?30000);????????????????????HttpConnectionParams.setSoTimeout(httpParams,?60000);?????????????SchemeRegistry?schemeRegistry?=?new?SchemeRegistry();??????????schemeRegistry.register(???????????????????new?Scheme("http",?80,?PlainSocketFactory.getSocketFactory()));??????????PoolingClientConnectionManager?cm?=?new?PoolingClientConnectionManager(schemeRegistry);??????????????????cm.setMaxTotal(200);??????????????????cm.setDefaultMaxPerRoute(20);??????????????????HttpHost?proxy?=?new?HttpHost("10.36.24.3",?60001);??????????httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY,??proxy);????????????????????HttpClient?httpClient?=?new?DefaultHttpClient(cm,?httpParams);?? ?
自動重連
? ?如果某次請求請求失敗,可以自動重連
?
Java代碼 ?
DefaultHttpClient?httpClient?=?new?DefaultHttpClient();??????????????????????????HttpRequestRetryHandler?requestRetryHandler2?=?new?HttpRequestRetryHandler()?{????????????????????????????????????public?synchronized?boolean?retryRequest(IOException?exception,?int?executionCount,?HttpContext?context)?{????????????????????????????????????????????if?(executionCount?>?3)?{??????????????????????????????????????????????????????return?false;??????????????????????????}??????????????????????????if?(exception?instanceof?NoHttpResponseException)?{??????????????????????????????????????????????????????return?true;??????????????????????????}??????????????????????????if?(exception?instanceof?SSLHandshakeException)?{??????????????????????????????????????????????????????return?false;??????????????????????????}?????????????????????????HttpRequest?request?=?(HttpRequest)?context.getAttribute(ExecutionContext.HTTP_REQUEST);????????????????????????boolean?idempotent?=?(request?instanceof?HttpEntityEnclosingRequest);????????????????????????if?(!idempotent)?{????????????????????????????????????????????????????return?true;????????????????????????}????????????????????????return?false;????????????????????}????????????????};???????????????httpClient.setHttpRequestRetryHandler(requestRetryHandler2);??? ?
?
?
?
?
使用自定義ResponseHandler處理返回的請求
?
?
Java代碼 ?
HttpClient?httpClient?=?new?DefaultHttpClient();??HttpGet?get?=?new?HttpGet(url);??????????ResponseHandler<byte[]>?handler?=?new?ResponseHandler<byte[]>()?{??????????public?byte[]?handleResponse(HttpResponse?response)??????????????????throws?ClientProtocolException,?IOException?{??????????????HttpEntity?entity?=?response.getEntity();??????????????if?(entity?!=?null)?{??????????????????return?EntityUtils.toByteArray(entity);??????????????}?else?{??????????????????return?null;??????????????}??????????}??????};??????????byte[]?charts?=?httpClient.execute(get,?handler);??????FileOutputStream?out?=?new?FileOutputStream(fileName);??????out.write(charts);??????out.close();????????httpClient.getConnectionManager().shutdown();?? ?
?
參考文獻
?
?
- HttpClient官網? ?api 下載 ?
- HttpClient官方pdf ?
- httpclient4.2.2的幾個常用方法,登錄之后訪問頁面問題,下載文件?
轉載于:https://www.cnblogs.com/yaowen/p/5446861.html
總結
以上是生活随笔為你收集整理的HttpClient学习系列 -- 学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。