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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
| 网址组成(四部分) 协议 http, https(https 是加密的 http) 主机 g.cn zhihu.com之类的网址 端口 HTTP 协议默认是 80,因此一般不用填写 路径 下面的「/」和「/question/31838184」都是路径
http: http: 10101000 168 ASCII a 97 01100001 A 65 01000001
电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑 自动向DNS服务器(domain name server)查询域名对应的IP地址 比如g.cn这样的网址,可以通过电脑的ping程序查出对应 IP 地址
➜ ping g.cn PING g.cn (74.125.69.160): 56 data bytes
端口是什么? 一个比喻: 用邮局互相写信的时候,ip相当于地址(也可以看做邮编,地址是域名) 端口是收信人姓名(因为一个地址比如公司、家只有一个地址,但是却可能有很多收信人) 端口就是一个标记收信人的数字。 端口是一个 16 位(二进制的 位)的数字,所以范围是 0-65535(2**16) ——HTTP协议—— 一个传输协议,协议就是双方都遵守的规范。 为什么叫超文本传输协议呢,因为收发的是文本信息。 1,浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器 2,服务器解析请求,按照规定的格式返回文本数据到浏览器 3,浏览器解析得到的数据,并做相应处理 请求和返回是一样的数据格式,分为4部分: 1,请求行或者响应行 2,Header(请求的 Header 中 Host 字段是必须的,其他都是可选) 3,\r\n\r\n(连续两个换行回车符,用来分隔Header和Body) 4,Body(可选) 请求的格式,注意大小写(这是一个不包含Body的请求): 原始数据如下 'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 打印出来如下 GET / HTTP/1.1 Host: g.cn 'GET / HTTP/1.1\r\nhost:www.qq.com\r\n\r\n' 其中
1, GET 是请求方法(还有POST等,这就是个标志字符串而已) 2,/ 是请求的路径(这代表根路径) 3,HTTP/1.1 中,1.1是版本号,通用了20年 具体字符串是 'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 返回的数据如下 HTTP/1.1 301 Moved Permanently Alternate-Protocol: 80:quic,p=0,80:quic,p=0 Cache-Control: private, max-age=2592000 Content-Length: 218 Content-Type: text/html; charset=UTF-8 Date: Tue, 07 Jul 2015 02:57:59 GMT Expires: Tue, 07 Jul 2015 02:57:59 GMT Location: http: Server: gws X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block
Body部分太长,先不贴了 其中响应行(第一行): 1,HTTP/1.1 是版本 2,301 是「状态码」,参见文末链接 3,Moved Permanently 是状态码的描述 浏览器会自己解析Header部分,然后将Body显示成网页 2xx 表示成功 3xx 表示移动走了或者别的什么情况 4xx 表示你发错了请求(比如你发的路径根本不存在 或者你发的请求是错的) 5xx 表示服务器挂了, 各种原因挂了 ——前端掌握 HTTP 协议有什么用—— 可以用 JS 动态抓取内容构建页面 比如动态评论、加载数据 比如天气预报程序 比如壁纸图片库 浏览器提供了使用 HTTP 协议收发数据的接口,名为 AJAX 这是一个重要的技术 ——浏览器安全问题—— 跨域请求问题和解决方案 1, 服务器设置 HTTP 协议头 */
var r = new XMLHttpRequest()
r.open('GET', '/login', true)
r.onreadystatechange = function() { console.log('onreadystatechange', r.readyState, r.readyState == 4) if(r.readyState == 4) { console.log('state change', r) } }
r.send()
var r = new XMLHttpRequest()
r.open('POST', '/login', true)
r.setRequestHeader('Content-Type', 'application/json')
r.onreadystatechange = function() { if (r.readyState == 4) { console.log('state change', r, r.status, r.response) var response = JSON.parse(r.response) console.log('response', response) } else { console.log('change') } }
var account = { username: 'gua', password: '123', } var data = JSON.stringify(account) r.send(data)
# 可以封装成这样的一个函数, 避免总监吃瘪
var ajax = function(method, path, data, reseponseCallback) { var r = new XMLHttpRequest() r.open(method, path, true) r.setRequestHeader('Content-Type', 'application/json') r.onreadystatechange = function() { if (r.readyState == 4) { reseponseCallback(r.response) } else { } } r.send(data) }
+
|