詳解HTTP請求與響應(yīng)基礎(chǔ)及實例
詳解HTTP請求與響應(yīng)基礎(chǔ)及實例
一、HTTP的請求與響應(yīng)
二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應(yīng)和請求
一、HTTP的請求與響應(yīng)
HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議。是客戶端和服務(wù)器端之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范。
通常,由HTTP客戶端發(fā)起一個請求,服務(wù)端一旦收到請求,向客戶端返回一個相應(yīng)(一個請求的發(fā)出,有且只有一個響應(yīng))。
(一)HTTP請求
請求報文格式如下:
請求行 - 請求頭 - 實體內(nèi)容
例如:
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
//空行
//實體內(nèi)容
1、請求行
請求行的格式為
GET /webDemo/Hellow HTTP/1.1
請求方式 請求資源 http協(xié)議版本
(1)請求方式
請求方法有:
1) GET 請求指定的頁面信息,并返回實體主體。
2) HEAD 類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報頭
3) POST 向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4) PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
5) DELETE 請求服務(wù)器刪除指定的頁面。
6) CONNECT HTTP/1.1協(xié)議中預留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
7) OPTIONS 允許客戶端查看服務(wù)器的性能。
8) TRACE 回顯服務(wù)器收到的請求,主要用于測試或診斷。
常用的請求方式主要是GET和POST(通常用于表單的提交),瀏覽器直接訪問的請求,默認提交方式為GET。
GET方法
提交的表單數(shù)據(jù)會在請求行的URI的后面。(以問號開頭,跟隨者鍵值對,以&連接)提交的數(shù)據(jù)大小有限制,不能超過1KB。不適合提交敏感數(shù)據(jù)。
POST方法
表單提交的數(shù)據(jù)會包含在實體內(nèi)容當中。
(2)請求資源
該請求資源為Request-URI是一個統(tǒng)一資源標識符(Uniform Resource Identifier)是一個用于標識某一互聯(lián)網(wǎng)資源名稱的字符串。(本地,局域,互聯(lián)網(wǎng))
(3)HTTP協(xié)議版本
http 1.0:當瀏覽器客戶端與服務(wù)器端建立連接后,發(fā)送一次請求后,就關(guān)閉連接
http 1.1:當瀏覽器客戶端與服務(wù)器端建立連接后,可以在一次連接后,發(fā)送多次請求
2、請求頭
常見的請求行:
Accept:text/html,image/*
請求報頭域用于指定客戶端接受哪些類型的信息
Accept-Charset: ISO-8859-1
求資源主機接受的編碼格式
Accept-Encoding: gzip,compress
求資源主機接受的數(shù)據(jù)壓縮格式
Accept-Language: en-us,zh-
求資源主機接受的語言
Host: localhost:8080
(必須的)主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的
User-Agent:
求資源主機瀏覽器類型
Connection:
求資源主機跟服務(wù)器連接狀態(tài)
Connection: close 會發(fā)送請求后,自動斷開連接
Connection: Keep-Alive 會發(fā)送請求后,依然保持連接
Date
求資源主機發(fā)出請求的時間
(二)HTTP響應(yīng)
應(yīng)答報文格式如下:
響應(yīng)行 - 響應(yīng)頭 - 實體內(nèi)容
HTTP/1.1 200 OK //響應(yīng)行
Server: Apache-Coyote/1.1 //相應(yīng)頭
Content-Length: 0
Date: Thu, 18 May 2017 13:21:23 GMT
//空行
//實體內(nèi)容
HTTP響應(yīng)與請求類似,主要了解的是其響應(yīng)行的狀態(tài)代碼。
狀態(tài)碼:
100-199 表示成功接收請求,要求客戶端繼續(xù)提交下一次請求才能完成整個處理過程
200-299 表示成功接收請求并已完成真?zhèn)€處理過程,常用200
300-399 為完成請求,客戶需進一步細化請求
400-499 客戶端的請求有錯誤,常用404
500-599 服務(wù)器出現(xiàn)錯誤,常用500
常見的狀態(tài)碼:
200 表示請求處理完成并完美返回
302 表示請求需要進一細化
404 表示客戶端訪問的資源找不到
500 表示服務(wù)端出現(xiàn)問題
二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應(yīng)和請求
(一)HttpServletRequest
//HttpServletRequest對象的常見方法 //請求行: request.getMethod(); //獲取請求的提交方式 request.getRequestURI(); //獲取請求的URI request.getProtocol(); //獲取請求的協(xié)議 //請求頭: request.getHeader(); //獲取請求頭的強求值 request.getHeaderName(); //獲取請求頭的所有名稱 //實體內(nèi)容: request.getInputStream(); //獲取實體內(nèi)容的輸入流
例如,我們可以搭建一個tomcat servlet服務(wù)端,來獲取用客戶端的請求信息。
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 {
//創(chuàng)建一個字符串來存儲請求信息
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");
//獲取實體內(nèi)容
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
通過例子,來看通過修改響應(yīng)信息來實現(xiàn)一些業(yè)務(wù)邏輯。
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對象,改變響應(yīng)信息
* */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、修改響應(yīng)行
resp.setStatus(404);
//resp.sendError(404);
//2、修改響應(yīng)頭
resp.setHeader("Server","JBoss");
//3、修改實體內(nèi)容
//發(fā)送字符類型的實體內(nèi)容
resp.getWriter().write("response");
//發(fā)送字節(jié)類型的實體內(nèi)容
resp.getOutputStream().write("response".getBytes());
//4、通過修改響應(yīng)頭,來請求重定向
//發(fā)送要給302狀態(tài)碼,location的響應(yīng)頭
/*
當瀏覽器認識到302狀態(tài)碼的時候,會再次自動向服務(wù)器發(fā)出一個請求,請求的地址就是location的value值
請求重定向,一共向服務(wù)器發(fā)出2次請求
*/
resp.setStatus(302);
resp.setHeader("location","/webDemo/index.html");
//也可以直接調(diào)用sendRedirect方法直接重定向
//resp.sendRedirect("/webDemo/adv.html");
//5、通過修改響應(yīng)頭,來實現(xiàn)定時刷新頁面
//一秒后刷新頁面
resp.setHeader("refresh","1");
//也可以定時重定向頁面
//resp.setHeader("refresh","1;url=/webDemo/index.html");
//6、通過修改響應(yīng)頭,來修改服務(wù)端和客戶端的傳輸?shù)臄?shù)據(jù)類型
//resp.setHeader("content-type","text/html")
//也可以直接調(diào)用setContentType方法直接設(shè)置
//在web.xml文件中找到對應(yīng)的數(shù)據(jù)類型寫法
resp.setContentType("text/html");
}
}
(三)獲取請求參數(shù)
由于GET和POST提交參數(shù)的位置不同(POST方法: 表單提交的數(shù)據(jù)會包含在實體內(nèi)容當中;GET方法: 提交的表單數(shù)據(jù)會在請求行的URI的后面。),因此GET和POST方法獲取請求參數(shù)的方法也不樣。
//獲取GET方式參數(shù): request.getQueryString(); //獲取POST方式參數(shù): request.getInputStream();
但是這樣獲得的參數(shù),需要進行字符串的拆分以后才能使用。因此,Tomcat自動將GET和POST的請求參數(shù)封裝在HttpServletRequest對象當中??梢哉{(diào)用以下方法獲得:
//根據(jù)指定名字來獲取參數(shù)值
request.getParameter("name");
request.getParameter("password");
//獲取所有參數(shù)名字
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){
String param = params.nextElement();
String value = request.getParameter(param);
}
(四)編碼問題
服務(wù)端和客戶端可能存在著編碼問題,當服務(wù)端和客戶端的編碼不同時,傳輸?shù)臄?shù)據(jù)就有可能因為編碼問題而導致亂碼。
1、手動解碼
在獲取的每個數(shù)據(jù)進行手工再次編碼,這里是必須知道服務(wù)端的編碼方式和客戶端的編碼方法。
name = new String(name.getBytes("iso-8859-1"),"utf-8");
2、設(shè)置參數(shù)查詢碼表
在獲取數(shù)據(jù)之前,調(diào)用setCharacherEncoding方法設(shè)置指定編碼格式。
該方法,只能對請求實體內(nèi)容的編碼起作用,所以只能對POST提交參數(shù)起作用。
request.setCharacherEncoding(“utf-8”);
3、修改服務(wù)器的配置文件
比如,tomcat服務(wù)器當中,修改server.xml配置文件
<!-- 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請求與響應(yīng)基礎(chǔ)的詳細介紹,如有疑問請大家留言!感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
springboot項目中的bootstrap.yml配置不生效的原因及解決(沒有自動提示)
新創(chuàng)建一個 springboot項目,添加了 bootstrap.yml 文件,發(fā)現(xiàn)文件并沒有如預期變成綠色葉子,編寫的時候也沒有自動提示,啟動的時候,發(fā)現(xiàn)端口是8080,由此發(fā)現(xiàn)配置并沒有生效,所以本文給大家講解了springboot項目中的bootstrap.yml配置不生效的原因及解決2024-01-01
Spring?boot詳解fastjson過濾字段為null值如何解決
這篇文章主要介紹了解決Spring?boot中fastjson過濾字段為null值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot系列教程之dubbo和Zookeeper集成方法
這篇文章主要介紹了SpringBoot系列教程之dubbo和Zookeeper集成方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
基于CopyOnWriteArrayList并發(fā)容器(實例講解)
下面小編就為大家?guī)硪黄贑opyOnWriteArrayList并發(fā)容器(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

