Http学习笔记

HTTP/HTTPS协议的介绍

HTTP协议的基本概念

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输
协议,所有的WWW文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文
件, 图片文件, 查询结果等)。

HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP协议的请求方法
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 隧道机制

HTTP的状态响应码
1XX: 指示信息,请求收到,继续处理
2XX: 成功操作成功收到,分析,接受
3XX: 完成请求必须进一步处理,重定向
4XX: 请求包含一个错误语法,不能完成。指示客户端错误
5XX: 服务器执行一个有效请求失败,指示服务端错误

HTTP的报文内容
请求报文

在这里插入图片描述

通用首部字段9种
在这里插入图片描述

请求首部字段19种
在这里插入图片描述

实体首部字段10种
在这里插入图片描述

抓包分析

在这里插入图片描述

响应首部字段9种

在这里插入图片描述

在这里插入图片描述

跨域访问
在sever返回的Response Head中添加Access-Control-Allow-Origin

Https 与 Http的前世今生

https密钥加密过程,通过非对称加密实现对称加密的数据传输,如下图。Https是不安全的,因为中间人是可以通过拦截报文实现对加密方式的破解,从而对传输内容的截取。

在这里插入图片描述

HTTP/1.0
1996年
传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令

HTTP/1.1
1997年
持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码

HTTP/2
2015年
多路复用、服务器推送、头信息压缩、二进制协议等

HTTP/3
在这里插入图片描述

• HTTPS是类似于TCP握手的工作方式,先工作在HTTP1上,通过HTTP1传递交换得到秘钥,然后切换到HTTPS上工作。 HTTP2也是基于TLS的,所以HTTP2的工作方式和HTTPS也是同样的过程,需要握手建立TLS连接,只是TLS连接完成后,发送一个HTTP2的连接确认消息,确认后,客户端服务器使用HTTP2进行连接通讯。 使用HTTP3首先要建立好HTTP2连接,然后发送HTTP2扩展帧,这个帧包含IP和端口,浏览器收到扩展帧,使用该IP和端口,使用QUIC建立连接,如果成功,断开HTTP2,升级为HTTP3。

Libmicrohttpd库的接口和使用介绍

以下是多有对外接口的简介

*********************** Main API ***************************
//创建服务实例
MHD_start_daemon
//允许现有连接,不允许新的连接加入
MHD_quiesce_daemon
//结束服务实例
MHD_stop_daemon
//Add another client connection to the set of connections
MHD_add_connection
//获得当前进程select集合
MHD_get_fdset
//获得poll函数的超时时间
MHD_get_timeout
//启动对文件句柄的监督
MHD_run
//启动服务&select poll
MHD_run_from_select

*********************** Connection ***************************
//获取连接的所有头信息
MHD_get_connection_values
//设置每个连接的头
MHD_set_connection_value
//获取错误的信息
MHD_set_panic_func
//处理转移字符
MHD_http_unescape
//查询一个连接中的头字段
MHD_lookup_connection_value
//把respons 放入返回队列
MHD_queue_response
//挂起连接
MHD_suspend_connection
//回复连接
MHD_resume_connection

*********************** Response ***************************
//设置response参数
MHD_set_response_options

//通过回调创建Response
MHD_create_response_from_callback
//通过data指针创建返回结果
MHD_create_response_from_data
//通过buffer创建返回结果
MHD_create_response_from_buffer
//通过buffer和回调创建返回结果
MHD_create_response_from_buffer_with_free_callback
//通过文件描述符来创建返回结果
MHD_create_response_from_fd
//升级协议,容许我们自己多一些事情(如websocket)
MHD_upgrade_action
//创建升级协议时的返回内容
MHD_create_response_for_upgrade
//销毁response
MHD_destroy_response
//为response添加Header
MHD_add_response_header
//在response中添加页脚
MHD_add_response_footer
//在response中删除头
MHD_del_response_header
//获取
MHD_get_response_headers

******************** PostProcessor functions *********************
MHD_create_post_processor
MHD_post_process
MHD_destroy_post_processor

******************** Digest Authentication functions ***************
MHD_digest_auth_get_username
MHD_digest_auth_check
MHD_queue_auth_fail_response
MHD_basic_auth_get_username_password

********************** generic query functions **********************
MHD_get_connection_info
MHD_set_connection_option
MHD_get_daemon_info
MHD_get_version
MHD_is_feature_supported

案例分析
结果返回函数
创建返回的response,在抛给库后进行销毁。

Example:

static enum MHD_Result
send_page (struct MHD_Connection *connection, const char *page)
{
enum MHD_Result ret;
struct MHD_Response *response;
response =
MHD_create_response_from_buffer (strlen (page), (void *) page,
MHD_RESPMEM_PERSISTENT);
if (! response)
return MHD_NO;
ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
MHD_destroy_response (response);
return ret;
}

销毁函数
用户销毁开辟的相应内存以及相应资源。
Example:

static void
request_completed (void *cls, struct MHD_Connection *connection,
void **con_cls, enum MHD_RequestTerminationCode toe)
{
struct connection_info_struct *con_info = *con_cls;

if (NULL == con_info)
return;
if (con_info->connectiontype == POST)
{
MHD_destroy_post_processor (con_info->postprocessor);
if (con_info->answerstring)
free (con_info->answerstring);
}
free (con_info);
*con_cls = NULL;
}

创建服务daemon
通过相关接口创建服务实例

Example:
struct MHD_Daemon *daemon;
daemon = MHD_start_daemon (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD,
Appendix C: Example programs 55
PORT, NULL, NULL,
&answer_to_connection, NULL,
MHD_OPTION_NOTIFY_COMPLETED, request_completed,
NULL, MHD_OPTION_END);
if (NULL == daemon)
return 1;
传输插件接口定义的构想
Restful API 介绍
https://restfulapi.net/
https://www.jianshu.com/p/84568e364ee8

资源、状态迁移
资源,服务所能提供的能力(抽象的资源)。对于媒体服务而言,个人理解是对音视频流处理的能力。资源在任何特定时间戳的状态称为资源表示。表示由数据、描述数据的元数据和超媒体链接组成,超媒体链接可以帮助客户机转换到下一个所需的状态。

如果客户端想要使用服务的资源,必须通过某种手段,让客户端相对于服务器端发生"状态转化"(State Transfer)。

Rest设计原则

客户机-服务器
通过将用户界面问题与资源能力分离,我们提高了用户界面跨多个平台的可移植性,并通过简化服务器组件提高了可伸缩性。最初的一些网页都是页面和资源整合在一起,Rest的思想是将他们分离,提高跨平台的能力。

无状态
从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。因此,会话状态完全保留在客户机上。

Cacheable
缓存要求请求响应中的数据隐式或显式标记为可缓存或不可缓存。如果响应是可缓存的,那么客户机缓存就有权将该响应数据重新用于以后的等效请求。

统一接口
通过将通用性的软件工程原理应用于组件接口,简化了整个系统架构,提高了交互的可视性。为了获得统一的接口,需要多个体系结构约束来指导组件的行为。REST由四个接口约束定义:资源标识;通过表示操作资源;自描述性消息;以及作为应用程序状态引擎的超媒体。

分层系统
分层系统样式通过约束组件行为,使每个组件无法“看到”与其交互的直接层之外的内容,从而允许体系结构由分层组成。

按需编码(可选)
根据需求简化客户端的编码。

Swagger Editor
一款restful api设计工具
https://swagger.io/tools/swagger-editor/

其他框架的封装

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值