HTTP簡介及運用Java獲取HTTP響應頭

簡介

HTTP響應頭是網站服務器端針對客戶的請求發出的一串信息,它可能包含了請求文檔的內容類型,文檔長度,對內容編碼的字符集,日期時間,內容的過時時間,內容的最後修改時間,服務器型號,是否進行緩存等重要信息。瞭解這些信息對Java的網絡編程具備重要的指導意義。 php

HTTP通訊機制

HTTP 使用內容類型,是指Web服務器向Web瀏覽器返回的文件都有與之相關的類型。全部這些類型在MIME Internet郵件協議上模型化,即Web服務 器告訴Web瀏覽器該文件所具備的種類,是HTML文檔、GIF格式圖像、聲音文件仍是獨立的應用程序。大多數Web瀏覽器都擁有一系列的可配置的輔助應 用程序,它們告訴瀏覽器應該如何處理Web服務器發送過來的各類內容類型。HTTP通訊機制是在一次完整的HTTP通訊過程當中,Web瀏覽器與Web服務器之間將完成下列7個步驟: html

(1)    創建TCP鏈接

HTTP 工做開始以前,Web瀏覽器首先要經過網絡與Web服務器創建鏈接,該鏈接是經過TCP來完成的,該協議與IP協議共同構建Internet,即著名的 TCP/IP協議族,所以Internet又被稱做是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議創建以後才能, 才能進行更層協議的鏈接,所以,首先要創建TCP鏈接,通常TCP鏈接的端口號是80

(2)    Web瀏覽器向Web服務器發送請求命令

一旦創建了 TCP鏈接,Web瀏覽器就會向Web服務器發送請求命令
例如: GET/sample/hello.jsp HTTP/1.1

(3)    Web瀏覽器發送請求頭信息

瀏覽器發送其請求命令以後,還要以頭信息的形式向 Web服務器發送一些別的信息,以後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。

(4)    Web服務器應答

客戶機向服務器發出請求後,服務器會客戶機回送應答,
HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態碼

(5)    Web服務器發送應答頭信息

正如客戶端會隨同請求發送關於自身的信息同樣,服務器也會隨同應答向用戶發送關於它本身的數據及被請求的文檔。

(6)    Web服務器向瀏覽器發送數據

Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據

(7)    Web服務器關閉TCP鏈接

通常狀況下,一旦 Web服務器向瀏覽器發送了請求數據,它就要關閉TCP鏈接,而後若是瀏覽器或者服務器在其頭信息加入了這行代碼

Connection:keep-alive。TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。 java

HTTP1.1常見響應碼

不論哪一個版本,響應碼從100到199總表示一個提供信息的相應,200到299總指示成功,300到399表示重定向,400到499表示客戶端錯誤,500到599表示服務器端錯誤。 linux

下面是一些常見的狀態碼及其含義 nginx

狀態碼
含義
100 Continue
服務器準備接受,容許客戶端在請求中發送大量數據以前詢問服務器是否將接受該請求
200 OK
請求成功,如果get或post請求,則包含請求數據;如果head請求,則之包含
301 Moved Permanently
資源已經永久移到一個新的URL
302 Moved Temporarily
資源暫時移到一個新的URL
304 Not Modified
客戶端應該從緩存中加載文檔
403 Forbidden
服務器理解請求,但有意拒絕處理
404 Not  Found
服務器找不到請求資源
500 Internal Server Error
服務器不知道如何處理
502 Bad Gateway
網關或者代理服務器試圖完成請求時,接受到一個無效的相應
503 Service Unavailable
服務器暫時沒法處理請求,多是超負荷或維護緣由

批量獲取一些網站的HTTP響應頭信息

獲取相應頭代碼:

package demo0808.demo1;
/**
 * 現實響應頭代碼
 */
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class ShowHttpHeaders {

	//要查找的網址
	private ArrayList<String> websites;
	/**
	 * 構造函數
	 * @param websites 網站列表
	 */
	public ShowHttpHeaders(ArrayList<String> websites) {
		this.websites=websites;
	}
	
	/**
	 * 獲取響應頭
	 * 打印到控制檯
	 */
	public void getHeaders() {
		if(websites==null) {
			System.err.println("查詢網址不能爲空!");
			return;
		}
		try {
			for(String website:websites) {
				System.out.println("----------------網站:"+website+"HTTP響應頭---------------");
				URL url = new URL(website);
				URLConnection connection = url.openConnection();
				Map<String, List<String>> headerFields = connection.getHeaderFields();
				Set<Entry<String, List<String>>> entrySet = headerFields.entrySet();
				Iterator<Entry<String, List<String>>> iterator = entrySet.iterator();
				while(iterator.hasNext()) {
					Entry<String, List<String>> next = iterator.next();
					String key=next.getKey();
					List<String> value = next.getValue();
					if(key==null)
						System.out.println(value.toString());
					else
						System.out.println(key+":"+value.toString());
				}
				System.out.println("");
			}
		} catch ( IOException e) {
			System.err.println("沒法查詢網址!");
		}
	}
}

測試代碼:


package demo0808.demo1;
/**
 * 測試代碼
 */
import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {
		String web1="http://www.oschina.net/";
		String web2="http://news.baidu.com/";
		String web3="https://linux.cn/";
		String web4="http://www.taobao.com/";
		ArrayList<String> websites=new ArrayList<String>();
		websites.add(web1);
		websites.add(web2);
		websites.add(web3);
		websites.add(web4);
		ShowHttpHeaders showHttpHeaders = new ShowHttpHeaders(websites);
		showHttpHeaders.getHeaders();
		
	}

}

測試結果:


----------------網站:http://www.oschina.net/HTTP響應頭---------------
[HTTP/1.1 403 Forbidden]
Date:[Sat, 08 Aug 2015 02:35:08 GMT]
Content-Length:[700]
Connection:[keep-alive]
Content-Type:[text/html;charset=UTF-8]
Server:[Tengine/2.1.0]

----------------網站:http://news.baidu.com/HTTP響應頭---------------
[HTTP/1.1 200 OK]
P3p:[CP=" OTI DSP COR IVA OUR IND COM "]
Transfer-Encoding:[chunked]
Vary:[Accept-Encoding, Accept-Encoding]
Date:[Sat, 08 Aug 2015 02:35:09 GMT]
Set-Cookie:[BAIDUID=27B1B47C0413E086084F1E668200715A:FG=1; expires=Sun, 07-Aug-16 02:35:09 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1, LOCALGX=%u5E7F%u5DDE%7C%35%34%39%36%7C%u5E7F%u5DDE%7C%35%34%39%36; expires=Sat, 15-Aug-2015 02:35:09 GMT; path=/; domain=.news.baidu.com]
Content-Type:[text/html]
Server:[Apache]

----------------網站:https://linux.cn/HTTP響應頭---------------
[HTTP/1.1 200 OK]
Strict-Transport-Security:[max-age=63072000; includeSubdomains; preload]
Transfer-Encoding:[chunked]
Date:[Sat, 08 Aug 2015 02:35:10 GMT]
Set-Cookie:[dx_516d_sid=qADFvF; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_lastact=1439001310%09index.php%09; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_sid=qADFvF; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_lastvisit=1438997710; expires=Mon, 07-Sep-2015 02:35:10 GMT; Max-Age=2592000; path=/; domain=.linux.cn; secure, dx_516d_saltkey=Vp3c3GiK; expires=Mon, 07-Sep-2015 02:35:10 GMT; Max-Age=2592000; path=/; domain=.linux.cn; secure; httponly]
Connection:[keep-alive]
Content-Type:[text/html; charset=utf-8]
Server:[nginx]
X-Content-Type-Options:[nosniff]

----------------網站:http://www.taobao.com/HTTP響應頭---------------
[HTTP/1.1 302 Found]
Date:[Sat, 08 Aug 2015 02:35:10 GMT]
Content-Length:[258]
Location:[https://www.taobao.com/]
Set-Cookie:[thw=cn; Path=/; Domain=.taobao.com; Expires=Sun, 07-Aug-16 02:35:10 GMT;]
Connection:[keep-alive]
Content-Type:[text/html]
Server:[Tengine]
相關文章
相關標籤/搜索