咸陽建設(shè)局網(wǎng)站私人做網(wǎng)站的流程
文章目錄
- 一. 概念
- 二. 請求報(bào)文的組成
- 三.HTTP請求行
- 四.HTTP請求頭
- 五.HTTP的請求體
- 六.響應(yīng)報(bào)文的組成
- 七.創(chuàng)建HTTP服務(wù)
- 八.獲取HTTP請求報(bào)文
- 九.HTTP設(shè)置響應(yīng)
- 十.GET和POST請求的區(qū)別
一. 概念
- HTTP協(xié)議. 中文叫超文本傳輸協(xié)議; 是一種基于TCP/IP的應(yīng)用層通信協(xié)議; 這個(gè)協(xié)議詳細(xì)規(guī)定了
瀏覽器
和萬維網(wǎng)服務(wù)器
之間互相通信的規(guī)則 - 協(xié)議中主要規(guī)定了兩個(gè)方面的內(nèi)容
- 客戶端: 用來向服務(wù)器發(fā)送數(shù)據(jù), 可以被稱為請求報(bào)文
- 服務(wù)端: 向客戶端發(fā)送數(shù)據(jù), 可以被稱為響應(yīng)報(bào)文
二. 請求報(bào)文的組成
- 請求行
- 請求頭
- 空行
- 請求體
三.HTTP請求行
-
請求方法: get post put delete等
-
請求URL(統(tǒng)一資源定位器)
http://www.baidu.com:80/index.html?a=100#logo
- http: ------- 協(xié)議(https ftp ssh等)
www.baidu.com
------- 域名- 80 ------- 端口號
- /index.html ------- 路徑
- a=100 ------- 查詢字符串
- #logo ------- 哈希(錨點(diǎn)鏈接)
四.HTTP請求頭
格式:
頭名:頭值
請求頭 | 請求值 |
---|---|
Host | 主機(jī)名 |
Connection | 連接的設(shè)置keep-alive(保持連接);close(關(guān)閉連接) |
Cache-Control | 緩存控制max-age=0(沒有緩存) |
Upgrade-Insecure-Requests | 將網(wǎng)頁中的http請求轉(zhuǎn)化為https請求 |
User-Agent | 用戶代理,客戶端字符串標(biāo)識, 服務(wù)器可以通過這個(gè)標(biāo)識來識別這個(gè)請求來自哪個(gè)客戶端, 一般在PC端和手機(jī)端的區(qū)分 |
Accept | 設(shè)置瀏覽器接收的數(shù)據(jù)類型 |
Accept-Encoding | 設(shè)置接收的壓縮方式 |
Accept-Language | 設(shè)置接收的語音q=0.7為喜好系數(shù),滿分為1 |
Cookie | 瀏覽器的緩存 |
五.HTTP的請求體
請求體類型
- 字符串
- JSON
六.響應(yīng)報(bào)文的組成
-
響應(yīng)行
HTTP/1.1 200 OK
- HTTP/1.1: HTTP協(xié)議版本號
- 200: 響應(yīng)狀態(tài)碼, 點(diǎn)擊打開狀態(tài)碼參考連接
- OK: 響應(yīng)狀態(tài)描述
響應(yīng)狀態(tài)碼和響應(yīng)字符串關(guān)系是一一對應(yīng)的
-
響應(yīng)頭
- Cache-Control:緩存控制private私有的, 只允許客戶端緩存數(shù)據(jù)
- Connection: 鏈接設(shè)置
- Content-type: text/html;charset=utf-8 設(shè)置響應(yīng)體的數(shù)據(jù)類型以及字符集, 響應(yīng)體為html, 字符集utf-8
- Content-Length: 響應(yīng)體的長度,單位為字節(jié)
-
空行
-
響應(yīng)體
響應(yīng)體內(nèi)容常見的類型有HTML、CSS、JS、圖片、JSON
七.創(chuàng)建HTTP服務(wù)
- 導(dǎo)入HTTP模塊
- 創(chuàng)建服務(wù)對象 create創(chuàng)建server服務(wù)
- 監(jiān)聽端口, 啟動服務(wù), 默認(rèn)端口為803佳美娜1
// 1. 導(dǎo)入HTTP模塊
const http = require('http')//2. 創(chuàng)建服務(wù)對象 create創(chuàng)建server服務(wù)
/*** 2.1. request為請求, 是對請求報(bào)文的封裝, 通過request對象可以獲得請求報(bào)文的數(shù)據(jù)* 2.2. response為響應(yīng), 是對響應(yīng)報(bào)文的封裝對象, 通過response對象可以設(shè)置響應(yīng)報(bào)文* 2.3 http.createServer里回調(diào)函數(shù)的執(zhí)行時(shí)期: 當(dāng)接受到HTTP請求時(shí)就會執(zhí)行*/
const server = http.createServer((request,response) => {// 解決中文亂碼response.setHeader('content-type','text/html;charset=utf-8')response.end("你好!")
})//3. 監(jiān)聽端口, 啟動服務(wù), 默認(rèn)端口為80
server.listen(9000,()=>{console.log('服務(wù)已啟動, 鏈接為http://127.0.0.1:9000')
})
八.獲取HTTP請求報(bào)文
獲取請求的數(shù)據(jù),需要通過
request
對象
- 獲取請求方法
- 獲取請求版本
- 獲取請求路徑
- 獲取URL路徑
- 獲取URL查詢字符串
- 獲取請求頭
- 獲取請求體
const server = http.createServer((request,response) => {/*** 獲取HTTP請求報(bào)文* 1.獲取請求方法* 2.獲取請求版本* 3.獲取請求路徑* 4.獲取URL路徑* 5.獲取URL查詢字符串* 6.獲取請求頭* 7.獲取請求體*/console.log(request.method) //POSTconsole.log(request.httpVersion)//1.1//3 只能獲取路徑以及查詢字符串,無法獲取URL中的域名以及協(xié)議的內(nèi)容console.log(request.url)// /?name=zhangsanconsole.log(require('url').parse(request.url).pathname) // ///5.不加第二個(gè)參數(shù)true, 返回的為字符串, 加上后返回對象console.log(require('url').parse(request.url,true).query) // name=zhangsanconsole.log(request.headers)// {// 'user-agent': 'PostmanRuntime/7.28.4',// accept: '*/*',// 'postman-token': '2837a024-bfa0-4ad7-ba76-93522f052301',// host: '127.0.0.1:9000',// 'accept-encoding': 'gzip, deflate, br',// connection: 'keep-alive',// 'content-type': 'application/x-www-form-urlencoded',// 'content-length': '10'// }//4.7 獲取請求體let body = ""request.on('data', chunk => {body += chunk})request.on('end',()=>{console.log(body)// name2=lisi// 解決中文亂碼response.setHeader('content-type','text/html;charset=utf-8')response.end(body)})})
- 獲取請求路徑和查詢字符串第二種方法
//實(shí)例化URL對象 new URL (input[, base])let urlObj = new URL (request.url, 'https://127.0.0.1')console.log(urlObj)console.log(urlObj.searchParams) // 獲取網(wǎng)址查詢參數(shù)的`URLSearchParams`對象,此屬性是只讀的 URLSearchParams { 'name' => '123' }console.log(urlObj.searchParams.get('name')) //123/*** URL {href: 'https://127.0.0.1/login?name=123',origin: 'https://127.0.0.1',protocol: 'https:',username: '',password: '',host: '127.0.0.1',hostname: '127.0.0.1',port: '',pathname: '/login',search: '?name=123',searchParams: URLSearchParams { 'name' => '123' },hash: ''}*/
九.HTTP設(shè)置響應(yīng)
//1.導(dǎo)入http模塊
const http = require('http')
//2.創(chuàng)建服務(wù)對象
const server = http.createServer((request,response)=>{/*** 設(shè)置http響應(yīng)報(bào)文* 1.設(shè)置響應(yīng)狀態(tài)碼* 2.設(shè)置響應(yīng)狀態(tài)描述* 3.設(shè)置響應(yīng)頭* 4.設(shè)置響應(yīng)體*///1.設(shè)置響應(yīng)狀態(tài)碼response.statusCode = 201//2. 設(shè)置響應(yīng)狀態(tài)描述response.statusMessage = 'success'// 3.設(shè)置響應(yīng)頭response.setHeader('server','test')response.setHeader('test',['a','b','c']) //可以創(chuàng)建多個(gè)相同鍵的響應(yīng)頭//4.設(shè)置響應(yīng)體response.write('123456')response.end('hello')
})
//3.監(jiān)聽端口啟動服務(wù)
server.listen(8001,()=>{console.log('服務(wù)已經(jīng)啟動,鏈接為http://127.0.0.1:8001')
})
十.GET和POST請求的區(qū)別
GET和POST是HTTP協(xié)議請求的兩種方式
- GET主要用來獲取數(shù)據(jù), POST主要用來提交數(shù)據(jù)
- GET帶參請求, 是將參數(shù)綴到URL之后, 在地址欄中輸入url訪問網(wǎng)站就是GET請求; POST帶參請求是將參數(shù)放到請求體中
- POST請求相對GET更安全一點(diǎn), 因?yàn)镚ET在瀏覽器中參數(shù)會暴露在地址欄
- GET請求大小有限制, 一般為2K, 而POST請求則沒有大小限制