网络基础二补充——json与http协议

news2024/11/28 10:58:36

五、市面上常用序列化和反序列化工具

​ 常用的有:json、protobuf、xml三种方案;

5.1json的使用

1.安装jsoncpp库,是一个第三方的开发库文件;

sudo yum install -y jsoncpp-devel

2.使用json

​ 经常使用的头文件是json.h,

在这里插入图片描述

​ 使用的动态库文件;

在这里插入图片描述

3.json语法

#include <jsoncpp/json/json.h>

//序列化

//1.创建Value对象
Json::Value root;
//Value是万能类,重载了[],返回值是Value对象引用,它的内部是一堆kv的形式;甚至可以放Value;
//root.size()是根据k来划分的;

//2.设置Value
root["x"] = 100;
root["y"] = 200;
root["op"] = '+';
root["desc"] = "this is a add algorithm";

//3.序列化Value
//有两种方式
//3.1对象实例化
Json::FastWriter w;
Json::StyledWriter w;//好处是可读性更好一些	
//3.2进行序列化
w.write(root);
//一个参数为Value对象;
std::cout << root << std::endl;
std::cout << w.write(root) << std::endl;

在这里插入图片描述

在这里插入图片描述

//4.反序列化Value
//4.1创建Value缓冲区和reader对象
Json::Value v;
Json::Reader r;
//4.2进行反序列化
r.parse(str,v);
//第一个参数是要进行反序列化的字符串;
//第二个参数是缓冲区;
//第三个参数表示是否有效,默认使用缺省参数;
//5.将Value对象解析成有效对象,使用as系列转换成有效的数据
int x = v["x"].asInt();
int y = v["y"].asInt();
char op = v["op"].asInt();
std::string desc = v["desc"].asCString();
std::cout << desc << " " << x << " " << op << " " << y << std::endl;

六、重谈ISO7层模型

6.1会话层

​ 实际上在代码当中体现为tcp服务端和客户端获取连接和发起连接,负责管理好连接;

6.2表示层

​ 其实就是指定制协议与序列化和反序列化,数据在网络中的转化;

6.3应用层

​ 针对特定应用的协议;

七、http协议

7.1统一资源定位符

​ 在平常的生活中,访问服务器其实使用的不是IP地址,而是域名这样的东西;域名的作用就是提高用户的体验,直接使用IP地址可读性较差,使用域名间接转换为IP地址这种方式可读性更好,更容易让人们接受这种使用方式;

​ 在浏览器中网址位置输入IP地址,会自动将39.156.66.14IP地址添加一些字段变为"http 😕/39.156.66.14/",浏览器中默认使用的协议一般是http或者https,会默认进行拼接的;这些协议服务的端口号一般是得固定下来,如:http是80,https是443,所以在拼接协议字段的时候是默认增加了端口号的;

​ url叫做统一资源定位符;由协议(服务的端口号)+域名(远端主机的IP地址)+资源路径,使用统一资源定位符,通过唯一路径定位,就可以在网上找到资源;其实就是在远端的主机上,使用服务进程并通过资源路径来查找主机内的资源;

​ 网络行为一般有两种:1.下载;2.上传;

在这里插入图片描述

​ 使用?k=v这种形式,来提交参数,多个参数可以使用&来进行划分支持多参数提交;

7.2urlencode和urldecode

​ 在使用url的时候,少量的情况会将提交或者获取的数据(可能包含和url中特殊字符冲突的字符),要求浏览器和服务器双方之间要进行编码(encode)和解码(decode);

​ 编码和解码防止和数据和url本身冲突;

​ 编码的规则是将需要转码的字符(在ASCII码中对应一个数,一个字节大小)转换为16进制,然后从右向左取4位,不足4位的每两位为1位,在前面加上%,编码成%xy的形式;

​ 网上也有在线进行编码和解码的工具;

7.3http请求和响应

​ 无论是请求还是响应都是以行的形式来陈列请求和响应

7.3.1http请求格式

​ 由请求行、请求报文、空行、请求正文构成;

请求行

​ 1.请求行之中除了结尾是不可以再出现回车换行符的;2.请求行的报头字段共有三部分,第一部分是请求方法,一般使用两种,一种叫做get方法,一种叫做post方法;第二部分以空格作为分隔符和第一部分区分,具体内容是URL,表示当前当前要请求的资源是谁;第三部分和第二部分也是使用空格作为分隔符,叫做请求的协议版本,即http版本,包括1.0 1.1 2.0,格式为http/1.1;注意需要是大写的;

请求报文

​ 由多行构成,每一行都叫做http的请求属性;这些属性大部分是键值对的形式;

空行

​ \r\n在行的最开始位置,通过行读取的方式,将报头和有效载荷分离;

请求正文

​ 要上传的内容;

在这里插入图片描述

​ 无法保证读到完整的正文,但是可以保证读到完整的请求报头;而报头的属性有 表示正文长度的字段,然后根据此属性读到一个完整的报文;

7.3.1http响应格式

​ 与请求类似;

状态行

​ 包括三部分,第一部分http版本(便于进行划分功能),第二部分状态码,第三部分为状态码描述;如:404 Not Found;对于请求必须有响应;

在这里插入图片描述

7.4使用工具进行http响应的抓取

1.telnet

telnet www.baidu.com 80

​ 最简单的请求报头和报文是可以没有的,但是请求行和空行必须有;所以如下操作之后即可获得一个响应;

GET / HTTP/1.1


​ 如下就是一个响应报文;

在这里插入图片描述

2.fiddler

​ 基于http进行抓包;fiddler工具就是一种代理,本来是浏览器访问服务器,变成了fiddler工具代理,进行请求包装和获取响应,然后再返回给浏览器;

3.postman

​ 当成浏览器使用;

7.5实现一个简单的http服务

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
//也可以用来进行tcp读取
//与read类似,多了第四个参数可以设置读取的方式
//0表示阻塞的方式
#pragma once

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include "Socket.hpp"
#include "Log.hpp"

const uint16_t defaultport = 8888;
class threadinfo
{
public:
    threadinfo(int sockfd) : sockfd_(sockfd) {}

public:
    int sockfd_;
};

class httpserver
{
public:
    httpserver(uint16_t port = defaultport) : port_(port) {}
    ~httpserver() {}

public:
    static void httphandler(int sockfd)
    {
        char buff[10240];
        ssize_t n = recv(sockfd, buff, sizeof(buff) - 1, 0);
        if (n > 0)
        {
            buff[n] = 0;
            std::cout << buff;
            // 返回一个响应
            std::string text = "<html><body><h3>hello world</h3></body></html>";
            std::string response_line = "HTTP/1.0 200 OK\r\n";
            std::string response_header = "Content-Length: ";
            response_header += std::to_string(text.size());
            response_header += "\r\n\r\n";
            std::string response;
            response += response_line;
            response += response_header;
            response += text;
            send(sockfd, response.c_str(), response.size(), 0);
        }
        close(sockfd);
    }
    static void *routine(void *args)
    {
        pthread_detach(pthread_self());
        threadinfo *hs = static_cast<threadinfo *>(args);
        httphandler(hs->sockfd_);
        delete hs;
        return nullptr;
    }
    bool start()
    {
        listensockfd_.Socket();
        listensockfd_.Bind(port_);
        listensockfd_.Listen();
        // lg(Info, "init done...");
        while (true)
        {
            std::string clientip;
            uint16_t clientport;
            int sockfd = listensockfd_.Accept(&clientip, &clientport);
            if (sockfd < 0)
                continue;
            pthread_t tid;
            threadinfo *td = new threadinfo(sockfd);
            pthread_create(&tid, nullptr, routine, (void *)td);
        }
    }

private:
    uint16_t port_;
    Sock listensockfd_;
};

在这里插入图片描述

​ 1.可以通过User-Agent来设计反爬策略;2.浏览器下载app,通过User-Agent的属性,来推送相关系统的软件;

​ http对于请求会创建一个响应,添加报头、空行和正文,包括将网页拼接到正文部分;发送过来的请求可能会包含请求什么网页,什么资源,通过url呈现出来;

7.6web根目录

​ wwwroot是web根目录,存放了允许别人访问的所有资源;

​ 可以直接在本地修改文件,通过浏览器直接访问到修改后的结果;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟张良均老师学大数据人工智能——泰迪智能科技第二期在线实习项目已开营

在这个信息爆炸的时代&#xff0c;如何有效地收集、处理、分析和利用数据&#xff0c;以获取有价值的信息&#xff0c;成为了各行各业面临的关键挑战。因此&#xff0c;数据分析挖掘、人工智能和大数据开发等领域的需求日益凸显&#xff0c;这些技术也成为了推动社会进步的重要…

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 本文结构&#xff1a;工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏&#xff1a;https://blog.csdn.net/cciehl/category_12615648.html 备注说明&#xff1a; 企业…

【面试题】RocketMQ如何处理消息重复的问题呢?

对分布式消息队列来说&#xff0c;同时做到确保一定投递和不重复投递是很难的&#xff0c;就是所谓的“有且仅有一次” 。RocketMQ择了确保一定投递&#xff0c;保证消息不丢失&#xff0c;但有可能造成消息重复。 处理消息重复问题&#xff0c;主要有业务端自己保证&#xff…

自动驾驶杂谈

在2024年的今天&#xff0c;自动驾驶技术已经迈向了一个崭新的阶段&#xff0c;日趋成熟与先进。昨日&#xff0c;我有幸亲眼目睹了自动驾驶车辆在道路上自如行驶的场景。然而&#xff0c;在市区拥堵的路段中&#xff0c;自动驾驶车辆显得有些力不从心&#xff0c;它们时而疾驰…

机器学习 -- 随机森林DEMO

场景 之前看一些歌手或者演员选取节目的时候&#xff0c;上面不是一个评委&#xff0c;少则三五个&#xff0c;多则几十个&#xff0c;当做重要决定时&#xff0c;大家可能都会考虑吸取多个专家而不只是一个人的意见。机器学习也是一样的&#xff0c;机器学习中分为两种&#…

“IT小百科 ”之“那些看不懂的HTTP状态码详解”

“IT小百科 ”之“那些看不懂的HTTP状态码详解” 小伙伴们应该遇到过在浏览器中打开某个网页&#xff0c;半天没打开&#xff0c;然后网页给出一个“ 提示码”&#xff0c;如下图所示 &#xff1a; 我相信看到这个提示的小伙伴普遍有点懵&#xff0c;这个提示码到底是什么意思…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

结构体与位段的定义以及在内存中的存储

目录 结构体的声明 完全声明 不完全声明 结构体变量的定义和初始化 结构体的嵌套 结构体成员的直接访问和间接访问 结构体的自引用 typedef对结构体类型重命名 结构体内存对齐 对齐规则 练习 为什么存在内存对齐 修改默认对齐数 结构体传参 结构体实现位段 位段…

代码膨胀会破坏开发操作吗,它将如何影响编译时间?

Incredibuild 正潜心研究公司以及客户的未来发展趋势。 过去的一年举步维艰&#xff0c;但聪明的企业总是能够抓住机遇&#xff0c;将大部分业务自动化&#xff0c;保持敏捷度和竞争力&#xff0c;最佳的案例就是游戏工作室。这一年来&#xff0c;用户对新游戏或新版本的期待达…

Python 基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中&#xff0c;可以使用内置的数学运算符&#xff0c;例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过&#xff0c;更高级的运算&a…

Python | Leetcode Python题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合&#xff0c;记录每个字符是否出现过occ set()n len(s)# 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左侧&#xff0c;还没…

Dubbo 原理及使用详解

嗨&#xff0c;亲爱的童鞋们&#xff01;欢迎来到这次关于Dubbo的探险之旅。在编程的世界里&#xff0c;我们时常需要处理分布式系统的问题&#xff0c;而Dubbo作为一款开源的分布式服务框架&#xff0c;正是为了解决这类问题而生。本篇博客将深入浅出&#xff0c;带你领略Dubb…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了&#xff0c;为么子哇 如下图

常见的DC电源模块故障及解决方法

BOSHIDA 常见的DC电源模块故障及解决方法 DC电源模块广泛应用于各种电子设备中&#xff0c;为其提供稳定的直流电源。然而&#xff0c;由于长期使用或其他原因&#xff0c;DC电源模块有时会出现故障。本文将介绍一些常见的DC电源模块故障及相应的解决方法。 1. 输出电压异常&a…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢&#xff1f;因为openai已经取消了免费的5刀赠送&#xff0c;那么这些人手上的免费的sses-key 用完后&#xff0c;就基本上全军覆没了&#xff0c;再…

探索http-vue-loader的奥秘:原理、使用方法、在Vue开发中的应用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权&#xff1a; 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。 授权&#xff1a;经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…

无尘卷轴布:保障洁净环境的关键利器

在现代科技高度发达的今天&#xff0c;许多行业对于环境洁净度的要求越来越严格&#xff0c;比如半导体制造、医疗器械生产等。而在这些领域中&#xff0c;无尘卷轴布成为了一项至关重要的辅助工具&#xff0c;其独特的设计和材质特性&#xff0c;为保障洁净环境做出了突出贡献…

如何备份 Outline 导出的 Markdown 文件

前面&#xff0c;我撰写了两篇文章&#xff0c;介绍了&#xff1a; 《如何在本地环境安装 Outline》《使用 Outline 搭建企业、个人知识库面临的问题》 今天&#xff0c;我们继续这个话题。使用 Outline 搭建知识库&#xff0c;如何备份自己知识库内的资料。 Outline 底层使用…

【教学类-09-03】20240401细线迷宫图02(A4横版一页-2份竖版)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-09-02】20240331细线迷宫图01&#xff08;A4横版一页1份横版&#xff09;-CSDN博客文章浏览阅读779次&#xff0c;点赞28次&#xff0c;收藏6次。【教学类-09-02】20240331细线迷宫图01&#xff08;A4横版一页1份横版&…