少年阿賓
那些青春的歲月
BlogJava
::
首頁
::
聯系
::
聚合
::
管理
500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(22)
給我留言
查看公開留言
查看私人留言
我參與的團隊
隨筆分類
ActiveMQ(5)
algorithm(10)
Apache Commons(2)
AXIS2(5)
cache(1)
concurrent(4)
Cookie
CSS(1)
cxf(3)
Database(11)
DatabaseIndex(4)
dbConnectPool(1)
Distribute(1)
dom4j(4)
easyMock(7)
eclipse(2)
face(2)
Generics(1)
git(1)
golang(2)
guava(1)
guava
hadoop(2)
HaProxy
hession(1)
hibernate(15)
HighConcurrency(5)
httpClient(29)
HTTPS(9)
httpsqs(1)
HttpUrlConnection(1)
ice
IO
Java Face(3)
Java NIO(2)
Java 文件操作(2)
JavaBasic(17)
JavaEnum(3)
JavaMail(1)
JavaMultithread(25)
Javascript(12)
javaWork(4)
Java內部類(4)
Java動態代理(1)
Java反射機制(5)
java基礎知識(2)
Java常用算法(1)
java集合類(9)
JDBCP(4)
JDOM(3)
Jetty(1)
JMOCK(3)
jquery(1)
JSON(2)
JSR
Junit(3)
JVM(18)
keepAlive(3)
linux(14)
LRU(1)
maven(3)
memcache(12)
microservice(1)
Mybatis(2)
mysql(26)
nginx(4)
oracle(37)
PatternDesigns(10)
Performance(1)
python(3)
quartz(6)
Redis(5)
Security(1)
servlet(1)
shell(8)
SIPHMPASTERISK(2)
Socket(2)
spring(14)
springmvc(1)
struts2(3)
TCP/IP(1)
tomcat(2)
twemproxy(1)
volatile(1)
Webservice(1)
wireshark(3)
workflow(2)
zookeeper(2)
正則表達式(4)
隨筆檔案
2018年1月 (1)
2017年12月 (2)
2017年8月 (2)
2016年8月 (1)
2016年6月 (1)
2016年5月 (1)
2016年4月 (1)
2015年11月 (2)
2015年10月 (3)
2015年9月 (2)
2015年8月 (4)
2015年7月 (3)
2015年6月 (1)
2015年5月 (8)
2015年4月 (19)
2015年3月 (21)
2015年2月 (5)
2015年1月 (22)
2014年12月 (10)
2014年11月 (1)
2014年10月 (5)
2014年8月 (1)
2014年3月 (3)
2013年12月 (1)
2013年10月 (2)
2013年9月 (10)
2013年8月 (7)
2013年7月 (4)
2013年6月 (1)
2013年5月 (12)
2013年4月 (21)
2013年3月 (9)
2013年2月 (1)
2013年1月 (26)
2012年12月 (19)
2012年11月 (32)
2012年10月 (19)
2012年9月 (51)
2012年8月 (46)
2012年7月 (20)
2012年6月 (15)
2012年5月 (13)
2012年4月 (5)
2012年3月 (27)
2012年2月 (4)
2012年1月 (2)
2011年12月 (24)
2011年11月 (1)
2011年10月 (6)
2011年9月 (1)
新聞分類
microservice
相冊
images
photo
搜索
最新評論
1.?re: dwr3實現消息精確推送詳細步驟
源碼誰有啊,求發給我,QQ798923617
--z_東九
2.?re: 聊聊高并發系統之限流特技-1
抄別人的都不知道寫一下轉載????
--垃圾
3.?re: 命令模式應用場景[未登錄]
訂單
--1
4.?re: 命令模式應用場景[未登錄]
32
--1
5.?re: HttpUrlConnection GET
是
--殺毒
閱讀排行榜
1.?如何用jquery獲取input中輸入的值?(71515)
2.?spring與mybatis三種整合方法(58270)
3.?dwr3實現消息精確推送詳細步驟 (33439)
4.?oracle function用法(33342)
5.?采用Spring管理Bean和依賴注入 (24196)
評論排行榜
1.?dwr3實現消息精確推送詳細步驟 (48)
2.?mysql 創建定時器(5)
3.?Hibernate hql 查詢指定字段并獲取結果集(4)
4.?Java 新生代、年輕代、老年代(4)
5.?超出的字符用..........代替(4)
HttpClient_4 用法 由HttpClient_3 升級到 HttpClient_4 必看
HttpClient程序包是一個實現了 HTTP 協議的客戶端編程工具包,要想熟練的掌握它,必須熟悉 HTTP協議。一個最簡單的調用如下:
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
public class Test {
public static void main(String[] args) {
// 核心應用類
HttpClient httpClient = new DefaultHttpClient();
// HTTP請求
HttpUriRequest request =
new HttpGet("http://localhost/index.html");
// 打印請求信息
System.out.println(request.getRequestLine());
try {
// 發送請求,返回響應
HttpResponse response = httpClient.execute(request);
// 打印響應信息
System.out.println(response.getStatusLine());
} catch (ClientProtocolException e) {
// 協議錯誤
e.printStackTrace();
} catch (IOException e) {
// 網絡異常
e.printStackTrace();
}
}
}
如果HTTP服務器正常并且存在相應的服務,則上例會打印出兩行結果:
GET http://localhost/index.html HTTP/1.1
HTTP/1.1 200 OK
核心對象httpClient的調用非常直觀,其execute方法傳入一個request對象,返回一個response對象。使用 httpClient發出HTTP請求時,系統可能拋出兩種異常,分別是ClientProtocolException和IOException。第一種異常的發生通常是協議錯誤導致,如在構造HttpGet對象時傳入的協議不對(例如不小心將”http”寫成”htp”),或者服務器端返回的內容不符合HTTP協議要求等;第二種異常一般是由于網絡原因引起的異常,如HTTP服務器未啟動等。
從實際應用的角度看,HTTP協議由兩大部分組成:HTTP請求和HTTP響應。那么HttpClient程序包是如何實現HTTP客戶端應用的呢?實現過程中需要注意哪些問題呢?
HTTP請求
HTTP 1.1由以下幾種請求組成:GET, HEAD, POST, PUT, DELETE, TRACE and OPTIONS, 程序包中分別用HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions 這幾個類創建請求。所有的這些類均實現了HttpUriRequest接口,故可以作為execute的執行參數使用。
所有請求中最常用的是GET與POST兩種請求,與創建GET請求的方法相同,可以用如下方法創建一個POST請求:
HttpUriRequest request = new HttpPost(
"http://localhost/index.html");
HTTP請求格式告訴我們,有兩個位置或者說兩種方式可以為request提供參數:request-line方式與request-body方式。
request-line
request-line方式是指在請求行上通過URI直接提供參數。
(1)
我們可以在生成request對象時提供帶參數的URI,如:
HttpUriRequest request = new HttpGet(
"http://localhost/index.html?param1=value1¶m2=value2");
(2)
另外,HttpClient程序包為我們提供了URIUtils工具類,可以通過它生成帶參數的URI,如:
URI uri = URIUtils.createURI("http", "localhost", -1, "/index.html",
"param1=value1¶m2=value2", null);
HttpUriRequest request = new HttpGet(uri);
System.out.println(request.getURI());
上例的打印結果如下:
http://localhost/index.html?param1=value1¶m2=value2
(3)
需要注意的是,如果參數中含有中文,需將參數進行URLEncoding處理,如:
String param = "param1=" + URLEncoder.encode("中國", "UTF-8") + "¶m2=value2";
URI uri = URIUtils.createURI("http", "localhost", 8080,
"/sshsky/index.html", param, null);
System.out.println(uri);
上例的打印結果如下:
http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2
(4)
對于參數的URLEncoding處理,HttpClient程序包為我們準備了另一個工具類:URLEncodedUtils。通過它,我們可以直觀的(但是比較復雜)生成URI,如:
List params = new ArrayList();
params.add(new BasicNameValuePair("param1", "中國"));
params.add(new BasicNameValuePair("param2", "value2"));
String param = URLEncodedUtils.format(params, "UTF-8");
URI uri = URIUtils.createURI("http", "localhost", 8080,
"/sshsky/index.html", param, null);
System.out.println(uri);
上例的打印結果如下:
http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2
request-body
與request-line方式不同,request-body方式是在request-body中提供參數,此方式只能用于POST請求。在 HttpClient程序包中有兩個類可以完成此項工作,它們分別是UrlEncodedFormEntity類與MultipartEntity類。這兩個類均實現了HttpEntity接口。
(1)
使用最多的是UrlEncodedFormEntity類。通過該類創建的對象可以模擬傳統的HTML表單傳送POST請求中的參數。如下面的表單:
<form action="http://localhost/index.html" method="POST">
<input type="text" name="param1" value="中國"/>
<input type="text" name="param2" value="value2"/>
<inupt type="submit" value="submit"/>
</form>
我們可以用下面的代碼實現:
List formParams = new ArrayList();
formParams.add(new BasicNameValuePair("param1", "中國"));
formParams.add(new BasicNameValuePair("param2", "value2"));
HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
HttpPost request = new HttpPost(“http://localhost/index.html”);
request.setEntity(entity);
當然,如果想查看HTTP數據格式,可以通過HttpEntity對象的各種方法取得。如:
List formParams = new ArrayList();
formParams.add(new BasicNameValuePair("param1", "中國"));
formParams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
System.out.println(entity.getContentType());
System.out.println(entity.getContentLength());
System.out.println(EntityUtils.getContentCharSet(entity));
System.out.println(EntityUtils.toString(entity));
上例的打印結果如下:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
39
UTF-8
param1=%E4%B8%AD%E5%9B%BD¶m2=value2
(2)
除了傳統的application/x-www-form-urlencoded表單,我們另一個經常用到的是上傳文件用的表單,這種表單的類型為 multipart/form-data。在HttpClient程序擴展包(HttpMime)中專門有一個類與之對應,那就是 MultipartEntity類。此類同樣實現了HttpEntity接口。如下面的表單:
<form action="http://localhost/index.html" method="POST"
enctype="multipart/form-data">
<input type="text" name="param1" value="中國"/>
<input type="text" name="param2" value="value2"/>
<input type="file" name="param3"/>
<inupt type="submit" value="submit"/>
</form>
我們可以用下面的代碼實現:
MultipartEntity entity = new MultipartEntity();
entity.addPart("param1", new StringBody("中國", Charset.forName("UTF-8")));
entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8")));
entity.addPart("param3", new FileBody(new File("C:\\1.txt")));
HttpPost request = new HttpPost(“http://localhost/index.html”);
request.setEntity(entity);
HTTP響應
HttpClient程序包對于HTTP響應的處理較之HTTP請求來說是簡單多了,其過程同樣使用了HttpEntity接口。我們可以從 HttpEntity對象中取出數據流(InputStream),該數據流就是服務器返回的響應數據。需要注意的是,HttpClient程序包不負責解析數據流中的內容。如:
HttpUriRequest request = ...;
HttpResponse response = httpClient.execute(request);
// 從response中取出HttpEntity對象
HttpEntity entity = response.getEntity();
// 查看entity的各種指標
System.out.println(entity.getContentType());
System.out.println(entity.getContentLength());
System.out.println(EntityUtils.getContentCharSet(entity));
// 取出服務器返回的數據流
InputStream stream = entity.getContent();
// 以任意方式操作數據流stream
// 調用方式 略
附注:
本文說明的是HttpClient 4.0.1,該程序包(包括依賴的程序包)由以下幾個JAR包組成:
commons-logging-1.1.1.jar
commons-codec-1.4.jar
httpcore-4.0.1.jar
httpclient-4.0.1.jar
apache-mime4j-0.6.jar
httpmime-4.0.1.jar
可以在此處下載完整的JAR包。
現在Apache已經發布了:HttpCore 4.0-beta3、HttpClient 4.0-beta1。
到此處可以去下載這些源代碼:http://hc.apache.org/downloads.cgi
另外,還需要apache-mime4j-0.5.jar 包。
在這里先寫個簡單的POST方法,中文資料不多,英文不太好。
package test;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
public class Test2 {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient(); //實例化一個HttpClient
HttpResponse response = null;
HttpEntity entity = null;
httpclient.getParams().setParameter(
ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); //設置cookie的兼容性
HttpPost httpost = new HttpPost("http://127.0.0.1:8080/pub/jsp/getInfo"); //引號中的參數是:servlet的地址
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("jqm", "fb1f7cbdaf2bf0a9cb5d43736492640e0c4c0cd0232da9de"));
// BasicNameValuePair("name", "value"), name是post方法里的屬性, value是傳入的參數值
nvps.add(new BasicNameValuePair("sqm", "1bb5b5b45915c8"));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); //將參數傳入post方法中
response = httpclient.execute(httpost); //執行
entity = response.getEntity(); //返回服務器響應
try{
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine()); //服務器返回狀態
Header[] headers = response.getAllHeaders(); //返回的HTTP頭信息
for (int i=0; i<headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
String responseString = null;
if (response.getEntity() != null) {
responseString = EntityUtils.toString(response.getEntity()); / /返回服務器響應的HTML代碼
System.out.println(responseString); //打印出服務器響應的HTML代碼
}
} finally {
if (entity != null)
entity.consumeContent(); // release connection gracefully
}
System.out.println("Login form get: " + response.getStatusLine());
if (entity != null) {
entity.consumeContent();
}
}
}
HttpClient4.0 學習實例 - 頁面獲取
HttpClient 4.0出來不久,所以網絡上面相關的實例教程不多,搜httpclient得到的大部分都是基于原 Commons HttpClient 3.1 (legacy) 包的,官網下載頁面:http://hc.apache.org/downloads.cgi,如果大家看了官網說明就明白httpclient4.0是從原包分支出來獨立成包的,以后原來那個包中的httpclient不會再升級,所以以后我們是用httpclient新分支,由于4.0與之前的3.1包結構以及接口等都有較大變化,所以網上搜到的實例大部分都是不適合4.0的,當然,我們可以通過那些實例去琢磨4.0的用法,我也是新手,記錄下學習過程方便以后檢索
本實例我們來獲取抓取網頁編碼,內容等信息
默認情況下,服務器端會根據客戶端的請求頭信息來返回服務器支持的編碼,像google.cn他本身支持utf-8,gb2312等編碼,所以如果你在頭部中不指定任何頭部信息的話他默認會返回gb2312編碼,而如果我們在瀏覽器中直接訪問google.cn,通過httplook,或者firefox 的firebug插件查看返回頭部信息的話會發現他返回的是UTF-8編碼
下面我們還是看實例來解說吧,注釋等我也放代碼里面解釋,放完整代碼,方便新手理解
本實例將
使用的httpclient相關包
httpclient-4.0.jar
httpcore-4.0.1.jar
httpmime-4.0.jar
commons-logging-1.0.4.jar等其它相關包
// HttpClientTest.java
package com.baihuo.crawler.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
class HttpClientTest {
public final static void main(String[] args) throws Exception {
// 初始化,此處構造函數就與3.1中不同
HttpClient httpclient = new DefaultHttpClient();
HttpHost targetHost = new HttpHost("www.google.cn");
//HttpGet httpget = new HttpGet("http://www.apache.org/");
HttpGet httpget = new HttpGet("/");
// 查看默認request頭部信息
System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset"));
// 以下這條如果不加會發現無論你設置Accept-Charset為gbk還是utf-8,他都會默認返回gb2312(本例針對google.cn來說)
httpget.setHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2)");
// 用逗號分隔顯示可以同時接受多種編碼
httpget.setHeader("Accept-Language", "zh-cn,zh;q=0.5");
httpget.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
// 驗證頭部信息設置生效
System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset").getValue());
// Execute HTTP request
System.out.println("executing request " + httpget.getURI());
HttpResponse response = httpclient.execute(targetHost, httpget);
//HttpResponse response = httpclient.execute(httpget);
System.out.println("----------------------------------------");
System.out.println("Location: " + response.getLastHeader("Location"));
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getLastHeader("Content-Type"));
System.out.println(response.getLastHeader("Content-Length"));
System.out.println("----------------------------------------");
// 判斷頁面返回狀態判斷是否進行轉向抓取新鏈接
int statusCode = response.getStatusLine().getStatusCode();
if ((statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||
(statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||
(statusCode == HttpStatus.SC_SEE_OTHER) ||
(statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
// 此處重定向處理 此處還未驗證
String newUri = response.getLastHeader("Location").getValue();
httpclient = new DefaultHttpClient();
httpget = new HttpGet(newUri);
response = httpclient.execute(httpget);
}
// Get hold of the response entity
HttpEntity entity = response.getEntity();
// 查看所有返回頭部信息
Header headers[] = response.getAllHeaders();
int ii = 0;
while (ii < headers.length) {
System.out.println(headers[ii].getName() + ": " + headers[ii].getValue());
++ii;
}
// If the response does not enclose an entity, there is no need
// to bother about connection release
if (entity != null) {
// 將源碼流保存在一個byte數組當中,因為可能需要兩次用到該流,
byte[] bytes = EntityUtils.toByteArray(entity);
String charSet = "";
// 如果頭部Content-Type中包含了編碼信息,那么我們可以直接在此處獲取
charSet = EntityUtils.getContentCharSet(entity);
System.out.println("In header: " + charSet);
// 如果頭部中沒有,那么我們需要 查看頁面源碼,這個方法雖然不能說完全正確,因為有些粗糙的網頁編碼者沒有在頁面中寫頭部編碼信息
if (charSet == "") {
regEx="(?=<meta).*?(?<=charset=[\\'|\\\"]?)([[a-z]|[A-Z]|[0-9]|-]*)";
p=Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
m=p.matcher(new String(bytes)); // 默認編碼轉成字符串,因為我們的匹配中無中文,所以串中可能的亂碼對我們沒有影響
result=m.find();
if (m.groupCount() == 1) {
charSet = m.group(1);
} else {
charSet = "";
}
}
System.out.println("Last get: " + charSet);
// 至此,我們可以將原byte數組按照正常編碼專成字符串輸出(如果找到了編碼的話)
System.out.println("Encoding string is: " + new String(bytes, charSet));
}
httpclient.getConnectionManager().shutdown();
}
}
http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113252.html
posted on 2012-09-26 16:46
abin
閱讀(5397)
評論(1)
編輯
收藏
所屬分類:
httpClient
Feedback
#
re: HttpClient_4 用法 由HttpClient_3 升級到 HttpClient_4 必看
2013-06-28 17:44
Neway
相當詳細,謝謝博主
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
相關文章:
httpClient Https 單向不驗證(httpClient連接池)
HttpAsyncClient 官方實例一
HttpClient HttpDelete
Http 四種請求訪問代碼 HttpGet HttpPost HttpPut HttpDelete
HttpClient 模擬form調用接口,自己添加header和body
HttpClient Get代理訪問
HttpClient Post代理訪問
HttpClient訪問單向https(不使用密鑰庫和信任庫)
HttpClient 請求單向https(使用密鑰庫)
HttpCLient4 Post請求
Copyright @ abin
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster
主站蜘蛛池模板:
免费黄色app网站
|
亚洲一区二区三区偷拍女厕
|
国产精品亚洲综合网站
|
亚洲AV无码乱码在线观看牲色
|
国产一区二区免费视频
|
www.亚洲成在线
|
亚洲国产中文字幕在线观看
|
91香蕉国产线观看免费全集
|
亚洲爆乳无码专区www
|
亚洲精品乱码久久久久久自慰
|
五月婷婷综合免费
|
高清永久免费观看
|
亚洲熟妇无码av另类vr影视
|
亚洲阿v天堂在线
|
日韩精品视频免费观看
|
久爱免费观看在线网站
|
亚洲AV无码一区二区三区性色
|
亚洲AV日韩精品久久久久久久
|
精品国产免费观看
|
91老湿机福利免费体验
|
无遮挡a级毛片免费看
|
youjizz亚洲
|
久久精品亚洲综合专区
|
亚洲AV无码不卡在线观看下载
|
青娱乐免费在线视频
|
国产一级a毛一级a看免费视频
|
亚洲欧美日韩中文字幕一区二区三区
|
亚洲男人都懂得羞羞网站
|
国产免费午夜a无码v视频
|
亚洲免费在线观看视频
|
亚洲一级片免费看
|
午夜亚洲国产理论片二级港台二级
|
91亚洲导航深夜福利
|
亚洲午夜久久久久久久久久
|
国产一区二区三区在线免费
|
在线看片无码永久免费视频
|
999任你躁在线精品免费不卡
|
成人无码区免费A∨直播
|
色屁屁在线观看视频免费
|
在线综合亚洲欧洲综合网站
|
亚洲欧洲日韩综合
|