首页 > Web开发 > 详细

base_http

时间:2018-10-21 17:23:58      阅读:162      评论:0      收藏:0      [点我收藏+]

http 基本

  1. 起因.
  2. Request 协议
  3. Response 协议
  4. http的原理.
  5. http的运行方式.
  6. http header
  7. 引用

1.起因

起因就是因为想实现一下ajax无刷新上传。搜索了一下需要用到 form-data,于是又准备继续看一下相关 form-data & 原生ajax. 看ajax的时候又发现 http 不是很熟悉。于是开始了 http 的学习。有了这篇文章。

2.Request 协议

分为3块。 报头,header,body

##### 报头

技术分享图片

这张图很清楚的说明了请求的方式。

  1. Method 可以是 GET,POST,DELETE等等. 请求的方式
  2. Path 请求的路径.
  3. Version of the protocol http版本。

##### header.

放在报头下面,用于描述和扩展这个请求。

技术分享图片

General headers,例如 Via,适用于整个报文。
Request headers,例如 User-Agent,Accept-Type,通过进一步的定义(例如 Accept-Language),或者给定上下文(例如 Referer),或者进行有条件的限制 (例如 If-None) 来修改请求。
Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

每一个参数都对应有表达和对应个格式,需要查询的话看这里

##### body

用于传输内容。
比如无刷新上传的 form-data 需要在里面传入参数。
理论上你可以在body里传入参数,但是服务器是否解析就不知道了。

POST方式是最常用的需要在body里传入参数的

这样你发给服务器,就会有对应的返回. 返回值其实也类似。

Response 协议

技术分享图片

这是一个返回。
其实和Request很类似

报头上返回

协议 + 状态码 + 信息

其他就是

header + body

状态码会告诉你这次请求的结果。 200 就是ok了。如果出现错误 message 会给你提示.
对应所有的状态码的表在这里

4. http的原理.

其实一直都知道 http 是基于tcp。 只是也不知道过程,是否是直接发送协议就好了

在node中使用net尝试发送了一下 http协议。

let net = require("net");
var Host = "127.0.0.1";
var PORT = 3002;


var client = new net.Socket();
client.connect(PORT, Host, d => {
    var h = "\r\n";
    var o = "GET /en HTTP/1.1" + h
        + "Host: localhost:3002" + h
        + "Connection: keep-alive" + h + h;

    client.write(o);
    client.write(o);
    client.write(o,"UTF8", function(d) {
        console.log("cb",d);
    });
});

client.on(‘data‘, data => {
    console.log(data.toString());
});

client.on(‘error‘, data => {
    console.log("error:", data);
});

client.on(‘close‘, data => {
    console.log(data);
    console.log(‘close‘);
});

我自己用 express 搭建了一个简单的服务。
创建一个 tcp,直接发送请求。

然后服务器返回

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 14740
ETag: W/"3994-j7Nux319iwzdxfspPtPQXL1lOx4"
set-cookie: front.sid=s%3AtpA4_wmu9pRxdomGHj1tWMra-kkUmagL.9KHKKgDlm7U1vdXSSbQbkwVGqGk9hqMHmsTm0hF2Tc4; Path=/; Expires=Wed, 15 Aug 2018 11:58:39 GMT; HttpOnly
Date: Wed, 15 Aug 2018 10:18:39 GMT
Connection: keep-alive

这就是基础。

5. 运行方式.

上面的简单代码说明了 http 请求其实就是tcp发送协议文本罢了。
但是早期协议是短链接。 也就是说

client.on(‘data‘, data => {
    console.log(data.toString());
    client.destroy();
});

你每一个请求都会新开一个链接,一次tcp,玩握手。 效率很低。
于是很明显的都想到了长连接
就如我上文中。在一个tcp 不断开,直接发送3次请求。 会返回三次。看似解决了这个问题。
但是呢,我换一个测试方式

var h = "\r\n";
var o = "GET /en HTTP/1.1" + h
    + "Host: localhost:3002" + h
    + "Connection: keep-alive" + h + h;

var o1 = "GET /en/hahaha HTTP/1.1" + h
    + "Host: localhost:3002" + h
    + "Connection: keep-alive" + h + h;

client.write(o);
client.write(o1);

这个时候,我先讲地址 /en 加断点。在断的时候,接下来的o1 并不能执行。 这也是一个问题。他不是并行的。 他需要一个一个执行.

接下来就是HTTP 流水线
这个是理论上的,因为我没有查到资料怎么自己去实现。 就是说解决了之前我说的在一个tcp并不是并行请求的问题。
流水线模式是可以并行的,在浏览器支持。

技术分享图片

这个就是图片上的解释,短连接,长连接,流水线。

6. http-header

header 字段比较多。需要的测试也比较多。

可以看这里 HTTP Headers

有所有的字段描述,这里就不赘述了。

6. 引用

  1. header 解释
  2. 状态码
  3. HTTP的长连接和短连接
  4. HTTP Headers

base_http

原文:https://www.cnblogs.com/HeyTommy/p/9825601.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!