一、HTTP的請求與響應
二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應和請求
一、HTTP的請求與響應
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用于從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。是客戶端和服務器端之間數據傳輸的格式規范。
通常,由HTTP客戶端發起一個請求,服務端一旦收到請求,向客戶端返回一個相應(一個請求的發出,有且只有一個響應)。
(一)HTTP請求
請求報文格式如下:
請求行 - 請求頭 - 實體內容
例如:
1
2
3
4
5
6
7
8
|
GET /webDemo/Hellow HTTP/ 1.1 //請求行 Host: localhost: 8080 //請求頭 Connection: keep-alive Accept: text/html Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q= 0.8 //空行 //實體內容 |
1、請求行
請求行的格式為
GET /webDemo/Hellow HTTP/1.1
請求方式 請求資源 http協議版本
(1)請求方式
請求方法有:
1) GET 請求指定的頁面信息,并返回實體主體。
2) HEAD 類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭
3) POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4) PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5) DELETE 請求服務器刪除指定的頁面。
6) CONNECT HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。
7) OPTIONS 允許客戶端查看服務器的性能。
8) TRACE 回顯服務器收到的請求,主要用于測試或診斷。
常用的請求方式主要是GET和POST(通常用于表單的提交),瀏覽器直接訪問的請求,默認提交方式為GET。
GET方法
提交的表單數據會在請求行的URI的后面。(以問號開頭,跟隨者鍵值對,以&連接)提交的數據大小有限制,不能超過1KB。不適合提交敏感數據。
POST方法
表單提交的數據會包含在實體內容當中。
(2)請求資源
該請求資源為Request-URI是一個統一資源標識符(Uniform Resource Identifier)是一個用于標識某一互聯網資源名稱的字符串。(本地,局域,互聯網)
(3)HTTP協議版本
http 1.0:當瀏覽器客戶端與服務器端建立連接后,發送一次請求后,就關閉連接
http 1.1:當瀏覽器客戶端與服務器端建立連接后,可以在一次連接后,發送多次請求
2、請求頭
常見的請求行:
Accept:text/html,image/*
請求報頭域用于指定客戶端接受哪些類型的信息
Accept-Charset: ISO-8859-1
求資源主機接受的編碼格式
Accept-Encoding: gzip,compress
求資源主機接受的數據壓縮格式
Accept-Language: en-us,zh-
求資源主機接受的語言
Host: localhost:8080
(必須的)主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的
User-Agent:
求資源主機瀏覽器類型
Connection:
求資源主機跟服務器連接狀態
Connection: close 會發送請求后,自動斷開連接
Connection: Keep-Alive 會發送請求后,依然保持連接
Date
求資源主機發出請求的時間
(二)HTTP響應
應答報文格式如下:
響應行 - 響應頭 - 實體內容
1
2
3
4
5
6
|
HTTP/ 1.1 200 OK //響應行 Server: Apache-Coyote/ 1.1 //相應頭 Content-Length: 0 Date: Thu, 18 May 2017 13 : 21 : 23 GMT //空行 //實體內容 |
HTTP響應與請求類似,主要了解的是其響應行的狀態代碼。
狀態碼:
100-199 表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程
200-299 表示成功接收請求并已完成真個處理過程,常用200
300-399 為完成請求,客戶需進一步細化請求
400-499 客戶端的請求有錯誤,常用404
500-599 服務器出現錯誤,常用500
常見的狀態碼:
200 表示請求處理完成并完美返回
302 表示請求需要進一細化
404 表示客戶端訪問的資源找不到
500 表示服務端出現問題
二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應和請求
(一)HttpServletRequest
1
2
3
4
5
6
7
8
9
10
11
12
|
//HttpServletRequest對象的常見方法 //請求行: request.getMethod(); //獲取請求的提交方式 request.getRequestURI(); //獲取請求的URI request.getProtocol(); //獲取請求的協議 //請求頭: request.getHeader(); //獲取請求頭的強求值 request.getHeaderName(); //獲取請求頭的所有名稱 //實體內容: request.getInputStream(); //獲取實體內容的輸入流 |
例如,我們可以搭建一個tomcat servlet服務端,來獲取用客戶端的請求信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package sun; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Hellow */ @WebServlet ( "/Hellow" ) public class GetRequestInfo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //創建一個字符串來存儲請求信息 StringBuffer req = new StringBuffer(); //獲取請求行 //獲取請求方法,URI,HTTP版本 req.append(request.getMethod()+ " " +request.getRequestURI()+ " " +request.getProtocol()+ "\n" ); //獲取請求頭 //獲取所有請求頭 Enumeration<?> headerName = request.getHeaderNames(); while (headerName.hasMoreElements()){ String header= (String)headerName.nextElement(); req.append(header+ ": " ); //獲取指定請求頭的值 Enumeration<?> headerValue = request.getHeaders(header); while (headerValue.hasMoreElements()){ req.append((String)headerValue.nextElement()+ ";" ); } req.append( "\n" ); } req.append( "\n" ); //獲取實體內容 InputStream input = request.getInputStream(); byte [] buffer = new byte [ 1024 ]; int len = 0 ; while ((len=input.read(buffer))!=- 1 ){ String str = new String(buffer, 0 ,len); req.append(str); } //輸出請求信息 System.out.println(req); } } |
(二)HttpServletResponse
通過例子,來看通過修改響應信息來實現一些業務邏輯。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package sun; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Response */ @WebServlet ( "/Response" ) public class ModifyResponseInfo extends HttpServlet { /** * Description: * 通過HttpServletResponse對象,改變響應信息 * */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1、修改響應行 resp.setStatus( 404 ); //resp.sendError(404); //2、修改響應頭 resp.setHeader( "Server" , "JBoss" ); //3、修改實體內容 //發送字符類型的實體內容 resp.getWriter().write( "response" ); //發送字節類型的實體內容 resp.getOutputStream().write( "response" .getBytes()); //4、通過修改響應頭,來請求重定向 //發送要給302狀態碼,location的響應頭 /* 當瀏覽器認識到302狀態碼的時候,會再次自動向服務器發出一個請求,請求的地址就是location的value值 請求重定向,一共向服務器發出2次請求 */ resp.setStatus( 302 ); resp.setHeader( "location" , "/webDemo/index.html" ); //也可以直接調用sendRedirect方法直接重定向 //resp.sendRedirect("/webDemo/adv.html"); //5、通過修改響應頭,來實現定時刷新頁面 //一秒后刷新頁面 resp.setHeader( "refresh" , "1" ); //也可以定時重定向頁面 //resp.setHeader("refresh","1;url=/webDemo/index.html"); //6、通過修改響應頭,來修改服務端和客戶端的傳輸的數據類型 //resp.setHeader("content-type","text/html") //也可以直接調用setContentType方法直接設置 //在web.xml文件中找到對應的數據類型寫法 resp.setContentType( "text/html" ); } } |
(三)獲取請求參數
由于GET和POST提交參數的位置不同(POST方法: 表單提交的數據會包含在實體內容當中;GET方法: 提交的表單數據會在請求行的URI的后面。),因此GET和POST方法獲取請求參數的方法也不樣。
1
2
3
4
5
|
//獲取GET方式參數: request.getQueryString(); //獲取POST方式參數: request.getInputStream(); |
但是這樣獲得的參數,需要進行字符串的拆分以后才能使用。因此,Tomcat自動將GET和POST的請求參數封裝在HttpServletRequest對象當中。可以調用以下方法獲得:
1
2
3
4
5
6
7
8
9
10
|
//根據指定名字來獲取參數值 request.getParameter( "name" ); request.getParameter( "password" ); //獲取所有參數名字 Enumeration<String> params = request.getParameterNames(); while (params.hasMoreElements()){ String param = params.nextElement(); String value = request.getParameter(param); } |
(四)編碼問題
服務端和客戶端可能存在著編碼問題,當服務端和客戶端的編碼不同時,傳輸的數據就有可能因為編碼問題而導致亂碼。
1、手動解碼
在獲取的每個數據進行手工再次編碼,這里是必須知道服務端的編碼方式和客戶端的編碼方法。
1
|
name = new String(name.getBytes( "iso-8859-1" ), "utf-8" ); |
2、設置參數查詢碼表
在獲取數據之前,調用setCharacherEncoding方法設置指定編碼格式。
該方法,只能對請求實體內容的編碼起作用,所以只能對POST提交參數起作用。
request.setCharacherEncoding(“utf-8”);
3、修改服務器的配置文件
比如,tomcat服務器當中,修改server.xml配置文件
1
2
3
4
5
6
7
8
9
|
<!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/ 1.1 Connector on port 8080 --> <!--在這里,加上屬性URIEncoding,及指定編碼值--> <Connector connectionTimeout= "20000" port= "8080" protocol= "HTTP/1.1" redirectPort= "8443" URIEncoding= "utf-8" /> |
以上就是HTTP請求與響應基礎的詳細介紹,如有疑問請大家留言!感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qq1131410679/article/details/72510541