http构造请求

目录

一、构建HTTP请求

1.1构建GET请求

1.2 构建POST请求

二、ajax

三、Postman

四、HTTPS是什么?

五、运营商劫持

六、HTTPS工作过程

一、构建HTTP请求

1.1构建GET请求

构建Get请求可以有以下方式:

  1. 地址栏输入URL
  2. html中的link,script,img,a
  3. form标签
  4. 点击收藏夹
    <form action="https://www.baidu.com" method="get">
        <input type="text" name="name">
        <input type="submit" name="提交">
    </form>

 form 代码和 HTTP 请求之间的对应关系:

  • form 的 action 属性对应 HTTP 请求的 URL
  • form 的 method 属性对应 HTTP 请求的方法
  • input 的 name 属性对应 query string 的 key
  • input 的 内容 对应 query string 的 value

1.2 构建POST请求

将刚才代码form中method改为POST 

    <form action="https://www.baidu.com" method="post">
        <input type="text" name="name">
        <input type="submit" name="提交">
    </form>

POST和GET请求还是比较相似的,主要有以下区别:
1.mthod从GET变成POST
2.数据从query string移动到了body中

form表单只能构造GET和POST请求,无法构造PUT,DELETE,OPTIONS等方法的请求

二、ajax

前端处理浏览器地址栏能构造GET请求,form表单构造GET和POST之外,还可以通过ajax的方式来构造HTTP请求,功能更加强大

ajax:Asynchronous Javascript And XML, 一种 js 给服务器发送HTTP 请求的方式,这里是异步的,不需要刷新页面/页面跳转就可以进行数据传输 

 这就是一种典型应用场景。 

如何使用ajax?
1.js提供了一组原生的ajax api,但是原生的api比较难用
2.jquery提供了ajax,是对原生api进行了封装,使用起来相对比较简单

我们首先引入jquery

    <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
    <script>
        $.ajax ({
            type: 'get',
            url: 'https://www.baidu.com/',
            success: function(data) {
                console.log(data);
            }
        });
    </script>

jquery中,$是一个特殊的全局对象,jquery都api都是以$方式引入的,$.ajax只有一个参数,是一个js对象

此时代码执行,我们只能看到构造的请求,无法获取到正确的响应,因为百度的服务器并没有处理咱们的请求 

ajax与form的区别?
1.ajax支持put,delete等方法
2.ajax可以灵活的设置header
3.ajax的body也是可以灵活设置的

三、Postman

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,经常用于接口测试
postman官网 :Download Postman | Get Started for Free

 如果是第一次使用,先注册一个账户

 这就是登录成功的界面 

我们首先需要创建一个工作空间,用于测试用例以及将我们的测试数据保存到云端,即使我们切换电脑数据也不会丢失 

 

我们每次请求数据后,可以按Save或者Ctrl + S将请求保存到云端 

四、HTTPS是什么?

HTTPS:HTTP + 安全层(SSL),HTTPS也是应用层协议,在HTTP协议的基础上引入了一个加密层,因为HTTP协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况

五、运营商劫持

不知道大家有没有这种现象,想要下载一款软件的时候,在网页点击下载的时候并不是直接下载的该软件,而是某一款应用商城。
点击下载按钮,给服务器发送一个HTTP请求,获取到的HTTP响应其实就包含该软件的下载链接,运营商劫持之后,就发现这个请求是要下载该软件,那么就自己的把要交该用户的响应给篡改成"应用商城"的下载地址了

为什么运营商会劫持?
最主要的原因还是HTTP在互联网上是明文传输,让运营商有了可乘之机

HTTPS就是为了避免这种情况的发生,在HTTP的基础上进行了加密,进一步的来保证用户的信息安全

加密是什么?
加密:加密就是将铭文进行一系列变换,生成密文
解密:解密就是把密文在进行一系列变换,还原成明文

在这个加密和解密的过程中,往往需要一个或多个中间的数据,辅助进行这个过程,这样的数据称之为密钥

六、HTTPS工作过程

        HTTPS在网络传输中不再直接传输明文了,而是加密之后的密文,HTTPS主要涉及到SSL部分,但SSL部分并不是只在HTTPS中使用,加密方式有很多种,但整体可以分为两大类:对称加密 和 非对称加密

对称加密
加密:明文 + key => 密文
解密:密文 + key => 明文
这里的key是同一把密钥,既可以用来加密,也可也用来解密,我们称之为对称密钥

既然是对称加密,那么客户端和服务器都需要密钥,那么是由客户端生成密钥还是由服务器生成密钥呢?
因为每个服务器对应很多客户端,每个客户端都有不同的密钥,所以我们这里是由客户端生成密钥,但是客户端虽然生成了,服务器还不知道该密钥,于是在传输数据之前需要先将密钥发送给服务器

当客户端生成密钥后,将密钥发送给服务器,但由于服务器并不知道密钥,于是这里的密钥只能进行明文传输,一明文这里的密钥就有可能被黑客给截获,那么后续的加密操作就形如虚设了。
因此,我们这里的密钥的传输必须进行加密传输,我们想要对密钥进行加密传输,就需要协商一个"密钥的密钥",以此循环都会面临该问题,此时的密钥使用对称加密的方式就行不通了。
因此我们就需要引入非对称加密了


非对称加密

非对称加密需要用到两个密钥,一个叫公钥,一个叫私钥,公钥和私钥是配对的,最大的缺点是运算速度非常慢,比非对称加密要慢很多。
明文 + 公钥 => 密文 使用公钥加密
密文 + 私钥 => 明文 使用私钥解密
这里的公钥和私钥可以交换位置,公钥是可以进行公开的。

服务器生成一对公钥私钥,客户端持有公钥,服务器持有私钥,此时客户端的公钥从服务器拿,黑客也能够知道公钥,但黑客不知道私钥,因为私钥是服务器私有的。
客户端使用私钥,来对对称密钥加密,传输给服务器,服务器就可以拿着自己的私钥对给密文进行解密获取到对称密钥,此时客户端就可以使用对称密钥对后续数据进行加密传输了。
为什么有了非对称加密,还要继续使用对称加密?
因为对称加密速度快,非对称加密速度慢,为了尽可能提高整体的速度,所以必须使用对称加密

但是即使这样加密之后还是会出现问题,会出现中间人攻击,因为黑客也可以获取到公钥

中间人攻击的主要是要让客户端能够辨别出来响应中的公钥是否是服务器真实的公钥,这里我们实际是引入一个证书,本质上是引入一个第三方的公证机构

证书

网站设立之初时,就需要取专门的认证机构去申请证书(提供网站的一些资质证明),如果审核通过之后,就会颁布一个证书,服务器生成的公钥也会在这个证书之中。
客户端在向服务器发送请求获取公钥的时候,就不是单单的获取一个公钥了,而是将整个证书都请求过来,客户端拿到证书之后,就可以对证书进行校验(这里可以通过验证,来判断证书是不是被篡改过的),如果发现证书是无效的,浏览器会直接弹窗警告。

 客户端拿到证书就会对证书进行校验,证书上面有一个特殊的字段叫做证书的签名。
检验过程:
1.判断证书的有效期是否过期
2.判定证书的发布机构是否受信任(操作系统已经内置了受信任的证书发布机构)
3.验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 设为 hash1. 然后计算整个证书的 hash 值, 设为 hash2. 对比 hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的. 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,可以使用Socket API来构造HTTP请求。以下是一个基本的HTTP请求构造方式: 1. 创建Socket连接:使用Socket API创建一个TCP连接。 2. 构造HTTP请求:使用C语言代码构造HTTP请求,包括请求方法、请求头、请求体等。 3. 发送HTTP请求:使用Socket API发送HTTP请求。 4. 接收HTTP响应:使用Socket API接收HTTP响应。 5. 处理HTTP响应:解析HTTP响应,从中提取所需信息,如响应头、响应体等。 6. 关闭Socket连接:使用Socket API关闭TCP连接。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAXLINE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servaddr; char sendline[MAXLINE], recvline[MAXLINE]; if (argc != 2) { fprintf(stderr, "usage: %s <URL>\n", argv[0]); exit(1); } // 创建Socket连接 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket error"); exit(1); } // 设置服务器地址和端口号 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); // HTTP默认端口号为80 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { fprintf(stderr, "inet_pton error for %s\n", argv[1]); exit(1); } // 建立连接 if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect error"); exit(1); } // 构造HTTP请求 sprintf(sendline, "GET / HTTP/1.1\r\n"); sprintf(sendline, "%sHost: %s\r\n", sendline, argv[1]); sprintf(sendline, "%sConnection: close\r\n", sendline); sprintf(sendline, "%s\r\n", sendline); // 发送HTTP请求 if (send(sockfd, sendline, strlen(sendline), 0) < 0) { perror("send error"); exit(1); } // 接收HTTP响应 while (recv(sockfd, recvline, MAXLINE, 0) > 0) { printf("%s", recvline); } // 关闭连接 close(sockfd); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值