HTTP请求和响应

目录

1.HTTP 请求 (Request)

1.URL

2. 请求方法 (method)​编辑

1. GET 方法

2. POST 方法

3. 其他方法

3.头信息

Host

Content-Length

Content-Type

User-Agent (简称 UA)

Referer

4.认识请求 "正文" (body)

2.HTTP 响应状态码

3.通过 form 表单构造 HTTP 请求

1.form 发送 GET 请求

2.form 发送 POST 请求

4.通过 ajax 构造 HTTP 请求

1.发送 GET 请求

2.发送 POST 请求

3.封装 ajax 方法

经典面试题: 谈谈 GET 和 POST 的区别


1.HTTP 请求 (Request)

1.URL

平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符).

互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.

一个具体的 URL:
https://v.bitedu.vip/personInf/student?userId=10000&classId=100
  • https : 协议方案名. 常见的有 http https, 也有其他的类型. (例如访问 mysql 时用的jdbc:mysql )
  • user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略
  • v.bitedu.vip : 服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址. (通过 ping 命令可以看到, v.bitedu.vip 的真实 IP 地址为 118.24.113.28 )
  • 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.
  • /personInf/student : 带层次的文件路径.
  • userId=10000&classId=100 : 查询字符串(query string). 本质是一个键值对结构. 键值对之间使用 分隔. 键和值之间使用 = 分隔.
  • 片段标识: URL 中省略了片段标识. 片段标识主要用于页面内跳转
URL 中的可省略部分
  • 协议名: 可以省略, 省略后默认为 http://
  • ip 地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名一致.
  • 端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80; 如果是 https 协议, 端口号自动设为 443.
  • 带层次的文件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候自动访问/index.html
  • 查询字符串: 可以省略
  • 片段标识: 可以省略

2. 请求方法 (method)

1. GET 方法

GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.

在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.

另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.

GET 请求的特点

  • 首行的第一部分为 GET
  • URL query string 可以为空, 也可以不为空.
  • header 部分有若干个键值对结构.
  • body 部分为空.

2. POST 方法

POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).

通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript ajax 也可以构造 POST 请求.

POST 请求的特点
  • 首行的第一部分为 POST
  • URL query string 一般为空 (也可以不为空)
  • header 部分有若干个键值对结构.
  • body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由header 中的 Content-Length 指定.

3. 其他方法

  • PUT POST 相似,只是具有幂等特性,一般用于更新
  • DELETE 删除服务器指定资源
  • OPTIONS 返回服务器所支持的请求方法
  • HEAD 类似于GET,只不过响应体不返回,只返回响应头
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个
  • CONNECT 预留,暂无使用

3.头信息

格式:多行,每一行都是 属性名/字段名:值

Host

表示服务器主机的地址和端口 .

Content-Length

表示 body 中的数据长度 .

如果有body,Content-Length就必须有(body是可变长度,所以带这个头信息,就是告诉对端body以该大小来解析)

Content-Type

表示请求的 body 中的数据格式 .

如果有body,Content-Type也必须有。对于请求body,是提交的数据;对于响应body,是返回的资源

作用:告诉对端body的数据形式,这样对端才能以相同的格式来渲染

User-Agent (简称 UA)

表示浏览器 / 操作系统的属性.

Referer

表示这个页面是从哪个页面跳转过来的 .

Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据).

往往可以通过这个字段实现 "身份标识" 的功能.

每个不同的域名下都可以有不同的 Cookie, 不同网站之间的 Cookie 并不冲突 .

作用:客户端保存数据的技术

4.认识请求 "正文" (body)

2.HTTP 响应状态码

  • 401  Unauthorized  未授权的 => 没有登陆不允许访问
  • 403  Forbidden  禁止访问 => 一般是登陆但没有访问权限
  • 404  Not Found  没有找到资源 => url对应的资源,服务端找不到
  • 405  Method Not Allowed 方法不支持/允许 => 服务方法列表不包含请求方法
  • 500  Server Internal Error  服务器内部错误 => 一般是服务端出错,如抛异常
  • 504  Gateway Timeout  网关超时 => 一般是服务端处理不过来请求(并发比较大),产生超时

3.通过 form 表单构造 HTTP 请求

form (表单) HTML 中的一个常用标签. 可以用于给服务器发送 GET 或者 POST 请求。

form 的重要参数:

  • action: 构造的 HTTP 请求的 URL 是什么.
  • method: 构造的 HTTP 请求的 方法 是 GET 还是 POST (form 只支持 GET POST).
input 的重要参数 :
  • type: 表示输入框的类型. text 表示文本, password 表示密码, submit 表示提交按钮.
  • name: 表示构造出的 HTTP 请求的 query string key. query string value 就是输入框的用户输入的内容.
  • value: input 标签的值. 对于 type submit 类型来说, value 就对应了按钮上显示的文本.

1.form 发送 GET 请求

<form action="http://abcdef.com/myPath" method="GET">
    <input type="text" name="userId">
    <input type="text" name="classId">
    <input type="submit" value="提交">
</form>
  • form action 属性对应 HTTP 请求的 URL
  • form method 属性对应 HTTP 请求的方法
  • input name 属性对应 query string key
  • input 的 内容 对应 query string value

2.form 发送 POST 请求

<form action="http://abcdef.com/myPath" method="GET">
    <input type="text" name="userId">
    <input type="text" name="classId">
    <input type="submit" value="提交">
</form>
主要的区别 :
  • method GET 变成了 POST
  • 数据从 query string 移动到了 body .

4.通过 ajax 构造 HTTP 请求

从前端角度 , 除了浏览器地址栏能构造 GET 请求 , form 表单能构造 GET POST 之外 , 还可以通过 ajax的方式来构造 HTTP 请求 . 并且功能更强大 .

特点是可以不需要刷新页面/页面跳转,就能进行数据传输

JavaScript 中可以通过 ajax 的方式构造 HTTP 请求 .
注意 : 为了验证 ajax 的功能 , 需要提前准备好一份配套的服务器程序 .

1.发送 GET 请求

创建 test.html, <script> 标签中编写以下代码.

// 1. 创建 XMLHttpRequest 对象
let httpRequest = new XMLHttpRequest();
// 2. 默认异步处理响应. 需要挂在处理响应的回调函数.
httpRequest.onreadystatechange = function () {
    // readState 表示当前的状态. 
    // 0: 请求未初始化
    // 1: 服务器连接已建立
    // 2: 请求已接收
    // 3: 请求处理中
    // 4: 请求已完成,且响应已就绪
    if (httpRequest.readyState == 4) {
        // status 属性获取 HTTP 响应状态码
        console.log(httpRequest.status);
        // responseText 属性获取 HTTP 响应 body
        console.log(httpRequest.responseText);
   }
}
// 3. 调用 open 方法设置要访问的 url
httpRequest.open('GET', 'http://42.192.83.143:8080/AjaxMockServer/info');
// 4. 调用 send 方法发送 http 请求
httpRequest.send();

浏览器和服务器交互过程(引入 ajax ):

2.发送 POST 请求

对于 POST 请求 , 需要设置 body 的内容
  1. 先使用 setRequestHeader 设置 Content-Type
  2. 再通过 send 的参数设置 body 内容.
发送 application/x-www-form-urlencoded 数据 ( 数据格式同 form post)
// 1. 创建 XMLHttpRequest 对象
let httpRequest = new XMLHttpRequest();
// 2. 默认异步处理响应. 需要挂在处理响应的回调函数.
httpRequest.onreadystatechange = function () {
    // readState 表示当前的状态. 
    // 0: 请求未初始化
    // 1: 服务器连接已建立
    // 2: 请求已接收
    // 3: 请求处理中
    // 4: 请求已完成,且响应已就绪
    if (httpRequest.readyState == 4) {
        // status 属性获取 HTTP 响应状态码
        console.log(httpRequest.status);
        // responseText 属性获取 HTTP 响应 body
        console.log(httpRequest.responseText);
   }
}
// 3. 调用 open 方法设置要访问的 url
httpRequest.open('POST', 'http://42.192.83.143:8080/AjaxMockServer/info');
// 4. 调用 setRequestHeader 设置请求头
httpRequest.setRequestHeader('Content-Type', 'application/x-www-formurlencoded');
// 5. 调用 send 方法发送 http 请求
httpRequest.send('name=zhangsan&age=18');

发送 application/json 数据

// 4. 调用 setRequestHeader 设置请求头
httpRequest.setRequestHeader('Content-Type', 'application/json');
// 5. 调用 send 方法发送 http 请求
httpRequest.send(JSON.stringify({
    name: 'zhangsan',
    age: 18
}));

3.封装 ajax 方法

原生的 XMLHTTPRequest 类使用并不方便 . 我们可以在这个基础上进行简单封装 .
// 参数 args 是一个 JS 对象, 里面包含了以下属性
// method: 请求方法
// url: 请求路径
// body: 请求的正文数据
// contentType: 请求正文的格式
// callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码
function ajax(args) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        // 0: 请求未初始化
        // 1: 服务器连接已建立
        // 2: 请求已接收
        // 3: 请求处理中
        // 4: 请求已完成,且响应已就绪
        if (xhr.readyState == 4) {
            args.callback(xhr.responseText, xhr.status)
       }
   }
    xhr.open(args.method, args.url);
    if (args.contentType) {
        xhr.setRequestHeader('Content-type', args.contentType);
   }
    if (args.body) {
        xhr.send(args.body);
   } else {
        xhr.send();
   }
}
// 调用该函数
ajax({
    method: 'get',
    url: '/info',
    callback: function (body, status) {
        console.log(status);
        console.log(body);
   }
});

经典面试题: 谈谈 GET 和 POST 的区别

  1. 语义不同: GET 一般用于获取数据, POST 一般用于提交数据.
  2. GET 的 body 一般为空, 需要传递的数据通过 query string 传递, POST 的 query string 一般为空, 需要传递的数据通过 body 传递
  3. GET 请求一般是幂等的, POST 请求一般是不幂等的. (如果多次请求得到的结果一样, 就视为请求是幂等的).
  4. GET 可以被缓存, POST 不能被缓存. (这一点也是承接幂等性).
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值