http协议同时传输文本和数据的新理解

FTP,SFTP,HTTP,HTTPS网络传输协议 1.FTP FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上.. 阅读详情

首先,承认本人对于http协议认知确实不够,从来没有仔细研究这一块。

其次,这回确实要把自己十几年的理解更新一下了,主要还是自己过去没有认真研究过http协议。

这一次是这么回事,碰到一个情况,要在一次消息中传输文本和照片,这个按说很常见,过去写网页都是表单中就直接用了,也没有碰到过自己封装协议的情况。

这回呢,因为客户端是单片机,单片机这块之前也是单独提交要么文本,要么图片,没有一次性传过多种数据。

然后呢,我让kimi给我代码,结果给我的是流指针的方式

kimi错误方案一:

// 获取底层 WiFiClient 对象
  WiFiClient *stream = http.getStreamPtr();
  if (stream) {
    // 发送文本部分
    stream->print(body);

    // 发送图片数据
    stream->write(current_fb->buf, current_fb->len);

    // 发送结束边界
    stream->print(endBoundary);

WiFiClient 流指针在esp32单片机实测,压根没法正确初始化,至于原因,就不想找了,怎么测都是不行的,初始化后都是false。既然库中有这个功能,按说是能用的,也可能是我单片机中性芯片的问题。

下来事情呢,我就想自己拼接字符串给服务器。

kimi又给我错误方案二:

// 构建请求体
  String body;
  body += "--" + boundary + "\r\n";
  body += "Content-Disposition: form-data; name=\"message\"\r\n\r\n";
  body += photo_text + "\r\n";

  body += "--" + boundary + "\r\n";
  body += "Content-Disposition: form-data; name=\"image\"; filename=\"photo.jpg\"\r\n";
  body += "Content-Type: image/jpeg\r\n\r\n";

  String endBoundary = "\r\n--" + boundary + "--\r\n";

  // 计算总请求体长度
  size_t totalLen = body.length() + current_fb->len + endBoundary.length();

  // 设置请求体长度
  http.addHeader("Content-Length", String(totalLen));

  // 构建完整的请求体
  String fullBody = body;
  fullBody += String((char*)current_fb->buf, current_fb->len); // 直接将图片的二进制数据追加到字符串中

因为  fullBody += String((char*)current_fb->buf, current_fb->len); 其实实际加入协议的是字符串化的二进制,php服务器端 $_FILES['image'];读取的是二进制,所以肯定对不上,就会报错误3.

这个事情说明,不要完全依赖于AI,他会反复给一个错误的方向,你怎么都调不通,最终没有办法,只好自己亲自下场把内容研究透彻。

经过我和kimi的唇枪舌战,kimi终于开窍了,给我了第三个方案。【这里我要骂AI了】

// 发送HTTP POST请求
  Serial.println("Sending HTTP POST request");

  HTTPClient http;
  http.begin(serverURL);

  String boundary = "----ESP32_CAMERA_BOUNDARY";
  http.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
  http.addHeader("User-Agent", "ESP32-Camera");
  http.setTimeout(60000);

  // 构建请求体的文本部分
  String body;
  body += "--" + boundary + "\r\n";
  body += "Content-Disposition: form-data; name=\"message\"\r\n\r\n";
  body += photo_text + "\r\n";

  body += "--" + boundary + "\r\n";
  body += "Content-Disposition: form-data; name=\"image\"; filename=\"photo.jpg\"\r\n";
  body += "Content-Type: image/jpeg\r\n\r\n";

  String endBoundary = "\r\n--" + boundary + "--\r\n";

  // 计算总请求体长度
  size_t totalLen = body.length() + current_fb->len + endBoundary.length();

  // 设置请求体长度
  http.addHeader("Content-Length", String(totalLen));

  // 构建完整的请求体
  http.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary);

  // 发送请求
  http.begin(serverURL);
  int httpCode = http.sendRequest("POST", body.c_str(), body.length());

  if (httpCode == 200) {
      // 文本部分发送成功,现在发送图片数据
      http.write(current_fb->buf, current_fb->len);
      http.write(endBoundary.c_str(), endBoundary.length());
      Serial.println("Image uploaded successfully");
  } else {
      Serial.println("Failed to send text part of the request");
  }

  http.end();

  Serial.println("arduino HTTP request completed");

这是一个通过两次发送数据,达到目的的一个方案,这个我是可以接受的,毕竟在同一个函数任务中,但是这么一个方案明明很简单为啥AI给我搞了两天,我和他激辩很久,才告诉我。。。好吧,果然人还是要靠自己。

其实吧,这个事情还有很多解决方案,比如base64,这是经常用的,再比如使用ArduinoHttpClient库,只是这次就想死磕多类型数据协议封装,才搞了好几天。

=============================

说一下最终决定写本文的目的吧。之所以被AI的这几套方案套了三天了,根源在于自己对于http的理解有问题。也是因为没有完全了解它。

现在更正一下我的认知,我一直以为http就是一去一回的,就是送过去,返回结果。

因为用惯了api什么的,写惯了网页,之前都是这么用的,最惭愧的是以前给小弟也是这么讲的(此处脸部温度180度)。尽管我很早,在20年前就知道长连接这个事情,但是默认的访问我一直认知上认为是一去一回,然后通讯中断。

直到今天(再次脸红),我和AI沟通了原因,http1.0的协议确实默认不支持长连接,都是一去一回就完事了。本人最早用http差不多在2003年,而http1.1是1997年就出来了,所以最早的对浏览器的认知确实是有问题的,十几年来一直认为默认就是一去一回,而现在的协议肯定都是http1.1的,问了ai默认都是http1.1,也就是早就支持默认长连接,断开的话需要代码控制断开。

这次去底层拼接,才搞明白这个事,真的是愚钝了。(脸红+1)

TCP/IP、Http/Soap协议-基本认识 写这篇文章的起因是在工作中开发接口,用到了Soap协议。关于为什么用Soap,以及它与常常听到和接触的Http协议、Tcp/Ip协议有什么关系,还需要进一步认识。     1、首先,先分别介绍一下三种协议的基本概念吧、     参考百度百科:     HTTP,超文本传输协议。它是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布 阅读详情

相关推荐

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 505

HTTP POST 方式传输文件(支持文本和二进制)

flyfish

二分掌柜的 1782

5G NR协议栈及功能1 - 总体架构与物理层

  备注:本文所有图片均来自3GPP标准,包括3GPP TS 38.300 V15.0.0 (2017-12)和3GPP TS 38.202 V15.0.0 (2017-12)等。本文主要介绍截止目前(2018年1月25日),3GPP 5G NR相关的协议内容,后期可能会有更新。   本系列共分为两部分:   1. 5G NR协议栈及功能1 - 总体架构与物理层 http://blog...

Wei Xingguang 11万+

HTTP:如何理解[超文本传输协议]

问: Http是什么? HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。 问:如何理解[超文本传输协议] 所谓超文本传输协议,可以拆分成3个部分: 超文本 传输 协议 协议: 在生活中,我们也能随处可见「协议」,例如: 刚毕业时会签一个「三方协议」; 找房子时会签一个「租房协议」; 生活中的协议,本质上与计算机中的协议是相同的,协议的特点: 所谓【协】,表示必须有两个以上的参与者。例如三方协议里的参与者有三个:你、公 司、学校三个;租房协议里.

OceanStar的博客 2226

通达信短周期指标盘中实时监控与预警选股实战

本文详细介绍了通达信短周期指标在盘中实时监控与预警选股中的实战应用。通过分时指标改造、多股同列监控技巧及预警策略优化,帮助短线交易者捕捉转瞬即逝的交易机会,提升选股效率与准确性。重点解析了如何避免假信号干扰及系统卡顿问题,并探讨了从预警到自动交易的进阶应用。

weixin_29230805的博客 894

QGroundControl实现多机控制

前言 作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。 目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于QGC地面站实现多机控制的一些方法。 某些地方写的可能不是很完善,欢迎大家补充。 目前该文章还未写完,后期本人会继续编写 多机控制原理 多机地面站支持TCP,UDP和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类LinkInterface,提供两个虚函数分别对应于数据接受和发送处理,针对于不同的连接方式实现TCP,UDP和串口连接相对应的子类TCPL

Phillweston的博客 8428

超文本传输协议HTTP

在了解HTTP 协议之前需要先了解一些其他的概念,了解它们之间的关系才能更好的理解HTTP 协议。 内容偏于理论知识,理解起来可能不是很容易,所以在阅读之前希望带着以下几个问题,增加阅读的兴趣。 为什么计算机可以访问其他不同的站点来获得丰富的信息?(万维网) 万维网工作需要解决的问题?(URL、HTTP、HTML) 统一资源定位符URL如何实现对资源的定位?URL 的一般格式...

点滴记录 2万+

从按键开机到I2C隔离:手把手拆解一个智能硬件项目里的MOS管实战配置

本文详细解析了智能硬件项目中MOS管的实战配置,从按键开机电路到I2C总线隔离,全面覆盖电源管理和信号隔离的关键技术。通过PMOS+NMOS组合方案实现可靠的开机功能,并采用双NMOS方案优化I2C通信隔离,提升系统稳定性和信号质量。

weixin_28691741的博客 326

实验14 超文本传输协议Http分析

在wireshark的分析下,HTTP的工作机理和工作过程能很明了地看出来,大概就是GET/Resonse相互进行,通过Get请求浏览器可向服务器发送请求,里面会包含请求内容、时间、请求源居多信息,还会提示服务器下次回复的分组窗口,服务器接收到了请求后,响应一段时间便会从浏览器要求的时机,进行Resonse回复。从图2中可观察到总共捕获到四个http 包,其中,包括 Http 的 Get分组(由本机浏览器向服务器gaia.cs.umass.edu发出的请求)以及服务器返回的响应分组。

qq_58454620的博客 4271

OWASP-ZAP扫描器的使用

目录 OWASP-ZAP 更新 代理 目录扫描 主动扫描(Active Scan) 扫描结果 生成报告 OWASP-ZAP OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者积极维护。它可以帮助你在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。 也可以说ZAP是一个中间人代理。它能够获取你对Web应用程序发出的所有请求以...

谢公子的博客 2万+

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2170

【网络】HTTP(超文本传输协议)详解

HTTP是一种应用层协议,属于TCP/IP协议族。它的主要作用是允许客户端(如浏览器)通过网络向服务器请求资源,服务器再将资源返回给客户端。特点无状态:每个请求都是独立的,服务器不保存任何会话信息。这意味着每次请求都需要重新验证。灵活性:HTTP支持多种数据格式,包括文本、图像、音频和视频等,使其适用于各种应用场景。简洁性:HTTP请求和响应的格式简单易懂,便于开发和调试。

人生苦短,睡觉要紧,睡醒再说 17万+

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2620

超文本传输协议(HTTP)与超文本传输安全协议(HTTPS)

HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。:HTTP/2.0 需要经过经典的 TCP 三次握手过程,TCP 和 TLS 是分层的,需要分批次来握手,先 TCP 握手,再 TLS 握手。:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议(UDP 的升级版本)来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。

锟斤拷 2002

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HTTP协议(超文本传输协议)

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。https://blog.youkuaiyun.com/freekiteyu/article/details/72236734...

qq_26449287的博客 662

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HTTP超文本传输协议

HTTP协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件,,查询结果等)。 HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。 HTTP是一个属于应用层的面

qq_43632625的博客 980

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HTTP超文本传输协议----记录

最近时不时会看到一些HTTP的帖子,所以自己也写一个,拿来备忘 1. 什么是超文本传输协议 HTTP中文全称就叫“超文本传输协议” 之前一直都是看过就完了,这两天看到几篇文章,详细解释了一下这个名字,所以我也就跟着大概理解了一下。 超文本传输协议,分为三个词:“超文本”,“传输”,“协议” 超文本:互联网初期只能传递文字文本信息,后来加了图片、视频、音频等信息,再后来,里面加了超链接,可以通过超链接跳转,到这里,就已经不是简单地纯文本信息了,语义扩大之后就被称为“超文本”‘。 传输:我通常理解为“寄快递”,

Waste_youth的博客 473

HTTP协议和HTTPS协议的理解

转载文章:【面试必备】硬核!30 张图解 HTTP 常见的面试题 一、HTTP基本概念 1.1 HTTP 是什么?描述一下 HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。 1.2 能否详细解释「超文本传输协议」? HTTP的名字「超文本协议传输」,它可以拆成三个部分: 超文本 HTTP 传输的内容是「超文本」。 「超文本」,是超越了普通...

肉丸不肉 2963

HTTP协议-11.HTTP传输大文件的方法

早期互联网上传输的基本上都是只有几K大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页HTML就有可能上百K,高质量的图片都以M论,更不要说那些电影、电视剧了,几G、几十G都有可能。 相比之下,100M的光纤固网或者4G移动网络在这些大文件的压力下都变成了“小水管”,无论是上传还是下载,都会把网络传输链路挤的“满满当当”。 所以,如何在有限的带宽下高效快捷地传...

凤凰涅磐 5901

计算机网络---http(超文本传输协议)

HTTP协议解析:从基础到演进 HTTP(超文本传输协议)是万维网的核心通信协议,具有无状态和无连接(早期)两大特性。其发展经历了多个版本迭代:从0.9的极简设计到1.1的长连接支持,再到2.0的二进制帧和多路复用,最终演进为3.0基于QUIC协议的UDP实现。HTTP的工作流程包含URL解析、TCP连接、请求发送、服务器处理、响应返回等步骤。核心组件包括定义操作类型的请求方法(如GET、POST)、表示处理结果的状态码(如200、404)以及传输元信息的头字段。当前主流仍以HTTP/1.1和2.0为主,H

MzKyle的博客 2637

Http协议详解(深入理解)

引入 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted...

leon 13万+

HTTP传输协议

目录1.简介2.请求数据格式3.响应数据格式 1.简介 HTTP(Hyper Text Transfer Protocol): 超文本传输协议,规定浏览器与服务器之间数据传输(请求、响应)的规则。 查看浏览器与服务器之间的数据请求与响应: 打开任一浏览器→F12→网络→F5刷新页面 随便点一个查看详情 请求发送的数据格式(比较固定)如下 HTTP协议特点: 基于TCP/IP的高级协议 ,面向连接,安全 三次握手,四次挥手 默认端口号:80 基于请求/响应模型的:一次请求对应一次响应 无状态的协议:

m0_54355172的博客 3087

HTTP(超文本传输协议)

HTTP--Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。 1 主要特点 1)支持客户端/服务器模式 2)简...

大猫 461

【深入理解HTTP协议】破冰篇

前言:本文将会引入HTTP的发展史、相关概念、相关协议、网络分层模型、域名、并搭建HTTP实验环境,参考课程为极客时间罗建锋老师的《透视HTTP协议》,讲得很棒!强推!!! 文章目录@[toc]1.HTTP协议的发展史2.HTTP是什么?2.1 协议2.2 传输2.3 超文本3.与HTTP相关的概念3.1 网络世界3.2 浏览器3.3 Web 服务器3.4 CDN3.5 爬虫3.6 HTML/WebService/WAF3.7 问答4.与HTTP相关的协议4.1 TCP/IP4.2 DNS4.3 URI/

林慢慢的博客 1804

HTTP协议

HTTP协议HTTP协议概述HTTP协议特点HTTP,URLURL介绍HTTP协议请求请求的构成请求行的格式请求头含义请求正文HTTP协议响应响应的构成响应行格式HTTP响应状态码 HTTP协议概述     超文本传输协议是互联网上应用最广泛的一种网络协议,HTTP是网络传输的一种标准,规则。是一个客户端与服务器请求和应答的标准。 超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网...

MPF1230的博客 2717

TCP/IP协议与Http协议的区别详解

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/I...

u011555996的博客 3897
上一篇: 通过python安装小智语音服务器端
下一篇: vscode无法复制terminal信息
CDialog
博客等级 码龄23年 245粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDialog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值