HTTP
POST和GET(from 代码随想录)
- 作用不同 GET用于从服务端获取资源 POST一般用来向服务器端提交数据
- 参数传递方式不同 GET请求的参数一般写在URL中,且只接受ASCII字符 POST请求参数一般放在请求体中,对于数据类型也没有限制
- 安全性不同 因为参数传递方式的不同,所以两者安全性不同,GET请求的参数直接暴露在URL中,所以更不安全,不能用来传递敏感信息。
- 参数长度限制不同 GET传送的数据量较小,不能大于2KB。 POST传送的数据量较大,一般被默认为不受限制。 HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。
- 编码方式不同 GET 请求只能进行 URL 编码(application/x-www-form-urlencoded) POST 支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多种编码。)
- 缓存机制不同 GET 请求会被浏览器主动cache,而 POST 不会,除非手动设置。 GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。 GET 产生的 URL 地址可以被 保存为书签,而 POST 不可以。 GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
- 时间消耗不同 GET 产生一个 TCP 数据包; POST 产生两个 TCP 数据包。 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
- 幂等 意思是多次执行相同的操作,结果都是「相同」的。 GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。 POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。
传输二进制数据
支持。
常见的Content-Type类型包括:
- text/plain:表示纯文本,没有特殊的格式和样式。
- text/html:表示HTML文档,可以在Web浏览器中显示。
- application/json:表示JSON格式的数据,用于数据交换。
- application/xml:表示XML格式的数据,用于数据交换。
- application/octet-stream:表示二进制数据,例如图片、音频、视频等。
- multipart/form-data:表示表单数据,用于文件上传。
- application/x-www-form-urlencoded:表示表单数据,用于提交表单。
- text/css:表示CSS样式表,用于网页的样式设计。
- application/javascript:表示JavaScript脚本,用于网页的交互操作。
HTTP实现一个多线程下载器
核心:要知道文件的大小,先通过HTTP HEAD请求获取Content-Length长度,然后根据这个长度分块,分到不同线程中分别下载。分段下载核心是,流式下载,在请求头添加开始和结束。
实现
实现一个多线程下载器涉及到HTTP请求的使用、文件I/O操作,以及多线程的管理。这里我将使用Python语言并使用其内置的
requests
库进行HTTP请求,threading
库来实现多线程,并使用os
和shutil
库进行文件操作。这种简化的多线程下载器将从指定的URL下载文件,并将其分割成若干部分,每个线程下载一部分。首先,我们需要确定远程文件的大小,这样我们才能将其分割成相等的部分供每个线程下载。我们可以通过发送
HEAD
请求并检查Content-Length
头来实现这一点。然后,我们将文件分割成相等的部分,并为每个线程分配一个部分。每个线程将向服务器发送一个带有
Range
头的GET
请求,该头指示服务器只发送文件的特定部分。最后,每个线程将其部分写入一个临时文件。当所有线程都完成下载后,主线程将所有部分合并到一个文件中。
以下是一个简单的实现:
这是一个非常简化的多线程下载器。在实际应用中,你可能需要添加错误处理代码,例如处理网络错误和文件I/O错误,以及更复杂的线程管理代码。你还可能需要调整代码以更好地适应大文件和慢速网络。
- 作者:Olimi
- 链接:https://olimi.icu/article/6f0763eb-6feb-41f0-88aa-af4a1fdbfb4f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。