1. 程式人生 > >Java網路通訊之HttpClient

Java網路通訊之HttpClient

HttpClient 是 Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。在Android系統中內建了HttpClient。Android下可以試試Square的OkHttp。 
http://hc.apache.org/httpcomponents-client-ga/index.html 
版本:httpclient-4.2.jar

1、基本請求
Java程式碼  收藏程式碼
  1. //建立一個客戶端  
  2. HttpClient client = new DefaultHttpClient();  
  3. //建立一個get方法  
  4. HttpGet get = new HttpGet("http://www.baidu.com");  
  5. //執行請求  
  6. HttpResponse res = client.execute(get);  
  7. //獲取協議版本・・・「HTTP/1.1」  
  8. System.out.println(res.getProtocolVersion());  
  9. //獲取返回狀態碼・・・「200」  
  10. System.out.println(res.getStatusLine().getStatusCode());  
  11. //獲取原因短語・・・「OK」  
  12. System.out.println(res.getStatusLine().getReasonPhrase());  
  13. //獲取完整的StatusLine・・・「HTTP/1.1 200 OK」  
  14. System.out.println(res.getStatusLine().toString());  
  15. //獲取返回頭部資訊  
  16. Header[] headers = res.getAllHeaders();  
  17. for (Header header : headers) {  
  18.     System.out.println(header.getName() + ": " + header.getValue());  
  19. }  
  20. //獲取返回內容  
  21. if (res.getEntity() != null) {  
  22.     System.out.println(EntityUtils.toString(res.getEntity()));  
  23. }  
  24. //關閉流  
  25. EntityUtils.consume(res.getEntity());  
  26. //關閉連線  
  27. client.getConnectionManager().shutdown();  
2、操作Cookie
Java程式碼  收藏程式碼
  1. //生成Cookie  
  2. CookieStore cookieStore = new BasicCookieStore();  
  3. BasicClientCookie stdCookie = new BasicClientCookie("name""value");  
  4. stdCookie.setVersion(1);  
  5. stdCookie.setDomain(".baidu.com");  
  6. stdCookie.setPath("/");  
  7. stdCookie.setSecure(true);  
  8. stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");  
  9. stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".baidu.com");  
  10. cookieStore.addCookie(stdCookie);  
  11. DefaultHttpClient client1 = new DefaultHttpClient();  
  12. client1.setCookieStore(cookieStore);  
  13. client1.execute(new HttpGet("http://www.baidu.com/"));  
  14. //獲取Cookie  
  15. DefaultHttpClient client2 = new DefaultHttpClient();  
  16. HttpGet httpget = new HttpGet("http://www.baidu.com/");  
  17. HttpResponse res = client2.execute(httpget);  
  18. List<Cookie> cookies = client2.getCookieStore().getCookies();  
  19. for (Cookie cookie : cookies) {  
  20.     System.out.println(cookie.getName());  
  21.     System.out.println(cookie.getValue());  
  22. }  
  23. EntityUtils.consume(res.getEntity());  
3、設定代理
Java程式碼  收藏程式碼
  1. //通過連線引數設定代理  
  2. DefaultHttpClient client1 = new DefaultHttpClient();  
  3. HttpHost proxy1 = new HttpHost("192.168.2.60"8080"HTTP");  
  4. client1.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy1);  
  5. HttpGet get1 = new HttpGet("http://www.facebook.com");  
  6. HttpResponse res1 = client1.execute(get1);  
  7. if (res1.getEntity() != null) {  
  8.     System.out.println(EntityUtils.toString(res1.getEntity()));  
  9. }         
  10. EntityUtils.consume(res1.getEntity());  
  11. //設定代理認證  
  12. //client1.getCredentialsProvider().setCredentials(  
  13. //        new AuthScope("localhost", 8080),  
  14. //        new UsernamePasswordCredentials("username", "password"));  
4、POST資料
Java程式碼  收藏程式碼
  1. //========UrlEncodedFormEntity  
  2. List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
  3. formparams.add(new BasicNameValuePair("param1""value1"));  
  4. formparams.add(new BasicNameValuePair("param2""value2"));  
  5. UrlEncodedFormEntity entity1 = new UrlEncodedFormEntity(formparams, "UTF-8");  
  6. HttpPost post1 = new HttpPost("http://localhost/post1.do");  
  7. post1.setEntity(entity1);  
  8. new DefaultHttpClient().execute(post1);  
  9. //========FileEntity  
  10. FileEntity entity2 = new FileEntity(new File("c:\\sample.txt"));  
  11. entity2.setContentEncoding("UTF-8");  
  12. HttpPost post2 = new HttpPost("http://localhost/post2.do");  
  13. post2.setEntity(entity2);  
  14. new DefaultHttpClient().execute(post2);  
  15. //========MultipartEntity  
  16. HttpPost post3 = new HttpPost("http://localhost/post3.do");  
  17. File upfile = new File("C:\\test.jpg");  
  18. MultipartEntity entity3 = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName("UTF-8"));  
  19. entity3.addPart("file_name",     new StringBody(upfile.getName()));  
  20. entity3.addPart("file_contents"new FileBody(upfile));  
  21. post3.setEntity(entity3);  
  22. new DefaultHttpClient().execute(post3);  
5、URI構建
Java程式碼  收藏程式碼
  1. //方法一  
  2. URI uri1 = URIUtils.createURI("http""www.baidu.com", -1"/s",  
  3.         "wd=rensanning&rsv_bp=0&rsv_spt=3&inputT=1766"null);  
  4. HttpGet httpget1 = new HttpGet(uri1);  
  5. //http://www.baidu.com/s?wd=rensanning&rsv_bp=0&rsv_spt=3&inputT=1766  
  6. System.out.println(httpget1.getURI());  
  7. //方法二  
  8. List<NameValuePair> qparams = new ArrayList<NameValuePair>();  
  9. qparams.add(new BasicNameValuePair("wd""rensanning"));  
  10. qparams.add(new BasicNameValuePair("rsv_bp""0"));  
  11. qparams.add(new BasicNameValuePair("rsv_spt""3"));  
  12. qparams.add(new BasicNameValuePair("inputT""1766"));  
  13. URI uri2 = URIUtils.createURI("http""www.baidu.com", -1"/s",  
  14.         URLEncodedUtils.format(qparams, "UTF-8"), null);  
  15. HttpGet httpget2 = new HttpGet(uri2);  
  16. //http://www.baidu.com/s?wd=rensanning&rsv_bp=0&rsv_spt=3&inputT=1766  
  17. System.out.println(httpget2.getURI());  
6、使用Scheme
Java程式碼  收藏程式碼
  1. DefaultHttpClient  httpclient = new DefaultHttpClient();  
  2. //========將Scheme設定到client中  
  3. SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();  
  4. Scheme httpsScheme = new Scheme("https"443, socketFactory);  
  5. httpclient.getConnectionManager().getSchemeRegistry().register(httpsScheme);  
  6. HttpGet httpget = new HttpGet("https://xxx.xxx.xxx");  
  7. HttpResponse res =  httpclient.execute(httpget);  
  8. System.out.println(EntityUtils.toString(res.getEntity()));  
  9. //========使用證書做SSL連線  
  10. KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());  
  11. FileInputStream fis = new FileInputStream("c:\\aa.keystore");  
  12. try {  
  13.     keyStore.load(fis, "password".toCharArray());  
  14. finally {  
  15.     fis.close();  
  16. }  
  17. @SuppressWarnings("unused")  
  18. SSLSocketFactory socketFactory2 = new SSLSocketFactory(keyStore);  
  19. //......  
7、認證
Java程式碼  收藏程式碼
  1. //========BASIC認證  
  2. DefaultHttpClient httpclient1 = new DefaultHttpClient();  
  3. UsernamePasswordCredentials creds1 = new UsernamePasswordCredentials("userid""password");  
  4. AuthScope auth1 = new AuthScope("localhost"80);  
  5. httpclient1.getCredentialsProvider().setCredentials(auth1, creds1);  
  6. HttpGet httpget1 = new HttpGet("http://localhost/auth1");  
  7. @SuppressWarnings("unused")  
  8. HttpResponse res1 =  httpclient1.execute(httpget1);  
  9. //========BASIC認證(HttpContext)  
  10. DefaultHttpClient httpclient2 = new DefaultHttpClient();  
  11. UsernamePasswordCredentials creds2 = new UsernamePasswordCredentials("admin""admin");  
  12. AuthScope auth2 = new AuthScope("localhost"80);  
  13. httpclient2.getCredentialsProvider().setCredentials(auth2, creds2);  
  14. HttpHost targetHost2 = new HttpHost("localhost"80"http");  
  15. AuthCache authCache = new BasicAuthCache();  
  16. BasicScheme basicAuth = new BasicScheme();  
  17. authCache.put(targetHost2, basicAuth);  
  18. BasicHttpContext localcontext2 = new BasicHttpContext();  
  19. localcontext2.setAttribute(ClientContext.AUTH_CACHE, authCache);  
  20. HttpGet httpget2 = new HttpGet("http://localhost/auth2");  
  21. @SuppressWarnings("unused")  
  22. HttpResponse res2 =  httpclient2.execute(httpget2, localcontext2);  
  23. //========DIGEST認證  
  24. DefaultHttpClient httpclient3 = new DefaultHttpClient();  
  25. UsernamePasswordCredentials creds3 = new UsernamePasswordCredentials("admin""admin");  
  26. AuthScope auth3 = new AuthScope("localhost"80);  
  27. httpclient3.getCredentialsProvider().setCredentials(auth3, creds3);  
  28. HttpHost targetHost3 = new HttpHost("localhost"80"http");  
  29. AuthCache authCache3 = new BasicAuthCache();  
  30. DigestScheme digestAuth = new DigestScheme();  
  31. digestAuth.overrideParamter("realm""some realm");  
  32. digestAuth.overrideParamter("nonce""whatever");  
  33. authCache3.put(targetHost3, digestAuth);  
  34. BasicHttpContext localcontext3 = new BasicHttpContext();  
  35. localcontext3.setAttribute(ClientContext.AUTH_CACHE, authCache3);  
  36. HttpGet httpget3 = new HttpGet("http://localhost/auth3");  
  37. @SuppressWarnings("unused")  
  38. HttpResponse res3 =  httpclient2.execute(httpget3, localcontext3);  
  39. //========NTLM認證  
  40. DefaultHttpClient httpclient4 = new DefaultHttpClient();  
  41. NTCredentials creds4 = new NTCredentials("user""pwd""myworkstation""microsoft.com");  
  42. httpclient4.getCredentialsProvider().setCredentials(AuthScope.ANY, creds4);  
  43. HttpHost targetHost4 = new HttpHost("hostname"80"http");  
  44. HttpContext localcontext4 = new BasicHttpContext();  
  45. HttpGet httpget4 = new HttpGet("http://localhost/auth4");  
  46. @SuppressWarnings("unused")  
  47. HttpResponse res4 = httpclient3.execute(targetHost4, httpget4, localcontext4);  
8、連線池
Java程式碼  收藏程式碼
  1. SchemeRegistry schemeRegistry = new SchemeRegistry();  
  2. schemeRegistry.register(new Scheme("http"80, PlainSocketFactory.getSocketFactory()));  
  3. schemeRegistry.register(new Scheme("https"443, SSLSocketFactory.getSocketFactory()));  
  4. PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);  
  5. 相關推薦

    Java網路通訊HttpClient

    HttpClient 是 Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。在Android系統中內建了HttpClient。Android下

    java網路通訊Socket通訊:TCP/UDP

    網路通訊三要素:協議,IP,埠。七層協議。 package com.qianfeng.test; /* * 網路程式設計基礎: * 網路的通訊:三要素:協議,IP,埠 * 1.IP:在網路上唯一的標記一臺主機 127.0.0.1 :保留地址/本地地址 java

    JAVA網路通訊NIO

    本篇將展現JAVA網路通訊中NIO的部分,和上一篇不同,本篇所用的Socket是通過SocketChannel的方式,這是NIO與傳統IO最主要的區別。 一、基於緩衝的SocketChannel 和傳統的IO基於流的方式不同,NIO採用基於緩衝的方式。二者的最重要的區

    JAVA網路通訊基礎篇

    一、Socket套接字 作為JAVA網路通訊的基礎,Socket幫助程序實現程序間的建立連線並相互通訊。而Socket又分為客戶端和服務端,也就是Socket和SocketServer。在JAVA開發過程中,採用Socket套接字開發是較為簡便的。 1、SocketS

    JAVA網路通訊InetAddress類

    眾所周知,IP是Internet Protocol的簡稱,它是一種網路協議。internet依靠TCP\IP協議,在全球的範圍內實現了不同硬體結構,不同作業系統,不同網路系統的互聯。在Internet網路中,每一臺主機在網路上用為其分配的Internet地址代表自己,這個地址

    Java網路程式設計Socket通訊(一)

           最近在學習Java網路程式設計,之前聽說過,但是一直都沒有認真瞭解過。這幾天突然來了興致,覺得很神奇,忽然就想要了解下具體是什麼個情況。         Socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。在Internet上的主機

    java網路程式設計Netty實戰資料通訊(七)

    Netty最佳實戰資料通訊 1 分析       我們需要了解下在真正專案應用中如何去考虛Netty的使用,大體上對於一引數設定都是根據伺服器效能決定的。這個不是最主要的。       我們要考慮的問題是兩臺機器(甚至多臺)使用Netty的怎樣進行通訊,我

    Java 服務端通訊httpClient

          httpClient是java服務端可以主動傳送http請求的很好用的一個輕量級工具。使用起來應該說是非常方便的。       首先在pom.xml檔案中引入依賴:       <!

    JAVA網路程式設計UDP通訊的實現步驟

    與TCP相比,UDP是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。UDP通訊主要用到兩個類DatagramPacket和DatagramSocket,下面分別介紹。1、DatagramSocket此類表示用來發送和接收資料報包的套接字。資料報套接字是包投遞服

    Java爬蟲技術HttpClient學習筆記

    結果 小爬蟲 如果 依賴包 很多 tac world 官方 靈活 第一節、HttpClient 一、HttpClient 簡介 超文本傳輸協議【The Hyper-Text Transfer Protocol (HTTP)】是當今互聯網上使用的最重要(significan

    網路通訊檢測遠端連線是否斷開連線

    判斷對方是否斷開連線: 一、方法層面的實現:   1,使用輸入流的read方法:     輸入流的read(byte[] ,int ,int) 方法,表示從當前的通道中讀取資料,具體讀取到的資料有返回的int值決定;這裡的返回值和丟擲的異常很重要,如果丟擲IOException異常,很明顯連線已經斷開;   

    Java網路程式設計Socket

    原文博主禁止轉載,不過我還是希望把一些關鍵的地方筆記下來,閱讀請移步 原文 以下是學習之後的個人筆記 一、Socket通訊基本例項   通過伺服器-客戶端模式引入Socket通訊 伺服器端 package cn.itcast.net; import java.io

    Java網路教程Socket

    原文地址  譯者:賈毅 當我們想要在Java中使用TCP/IP通過網路連線到伺服器時,就需要建立java.net.Socket物件並連線到伺服器。假如希望使用Java NIO,也可以建立Java NIO中的SocketChannel物件。 建立Socket 下面的示例程式碼是連線到IP地址為7

    網路通訊 位元組序轉換原理與網路位元組序、大端和小端模式

         原因如下:網路協議規定接收到得第一個位元組是高位元組,存放到低地址,所以傳送時會首先去低地址取資料的高位元組。小端模式的多位元組資料在存放時,低地址存放的是低位元組,而被髮送方網路協議函式傳送時會首先去低地址取資料(想要取高位元組,真正取得是低位元組),接收方網路協議函式接收時會將接收到的第一個位元

    Java網路程式設計URL和URI

    URL和URI URL可以唯一地標識一個資源在Internet上的位置。URL是最常見的URI URI URI的結構: 模式:模式特定部分 常見的模式有: data file ftp http mailto magnet teln

    Java網路程式設計URLEncode和URLDecode工具類

    import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class EncodeTest {

    網路通訊Socket小結

    最近在寫一個關於資料通訊系列的文章,所以Socket是少不了的,今天就和大家來簡單分享下Socket的使用方式,以及關於Socket的幾個比較重要,容易被小夥伴們忽略且常用的方法, 好了,進入今天的正題。 之前有在面試時候問到http請求底層是基於什麼

    Android實現https網路通訊新增指定信任證書/信任所有證書

    當Android客戶端訪問https網站,預設情況下,受證書信任限制,無法訪問,可以有兩種解決方法來實現: 1、將要訪問的https網站的ca證書新增到客戶端信任證書列表中,此種方式為谷歌推薦,安全性高。 2、將客戶端設定為信任所有證書,也就是說不驗證伺服器證書,此種方式實

    JAVA網路程式設計模擬表單提交

    這一篇部落格是對上一篇《JAVA網路程式設計之獲取網路資源》的擴充,這一篇將使用HttpURLConnection來模擬一個表單的提交。在B/S架構的系統中,請求時通過瀏覽器與服務端進行互動的,提交請求引數時使用form表單進行提交,但是有很多時候,我們需要在程

    Java網路程式設計Netty拆包和黏包-yellowcong

    Netty中,解決拆包和黏包中,解決方式有三種 1、在每個包尾部,定義分隔符,通過回車符號,或者其他符號來解決 2、通過定義每個包的大小,如果包不夠就空格填充 3、自定義協議的方式,將訊息分為訊息頭和訊息體,在訊息頭中表示出訊息的總長度,