Android 网络请求原理以及原始数据包

简介:

我们在请求网络的时候都是使用各种框架,或者是 Android SDK 为我们提供的网络请求类。但是你知不知道原始的网络请求包是什么样的呢?或许你说这有什么作用,我会使用框架就好了。很显然,这种想法是有问题的。一些网络请求的基本知识我们还是需要掌握的。这对我们更深入的开发和掌握更深的技术是非常有必要的。

关于 HTTP 请求报文和响应报文的格式这里就不再过多介绍了,简单说,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:请求行、请求头、请求体。类似于:

<空格> <协议版本号> <回车> <换行符>

<请求头>

<请求体>

其中协议规定了 POST 提交的数据必须放在请求体内,但是并没有规定,请求体内提交的数据要用什么编码方式,这个是由开发者来自己来决定的。但是虽然我们可以自己来决定什么编码方式,但是数据发送出去,还是要服务器解析的。一般的开发语言,比如:php、Python、java 等等,他们的网络有关的 API 都内置了自动解析常见的数据类型。这个类型放在了请求头中的 Content-Type 中。根据这个字段我们就可以获取请求体的编码方式了。前面说了这个编码方式我们是可以自己定义的。但是为了规范,并且开发语言内置了请求体的编码方式。所以我们还是要根据规范和开发语言的需求来。

下面来介绍常用的请求头的编码方式

application/x-www-form-urlencoded

这种方式是 POST 请求中提交数据最常见的方式了。其中 Volley 框架就是默认使用的这种编码方式。其实不仅仅是 Volley 框架,一般的网络请求如果没有特别设置的话都是采用了这种编码方式,采用这种编码方式的 HTTP 请求报文是这样的(这里只是简单的写了一下)

POST /xxx/xxx HTTP/1.1    // 请求行
// 请求头
Host: 192.168.1.111:8080   
Content-Type: application/x-www-form-urlencoded  // 表示了请求体采用哪种编码方式
Cache-Control: no-cache

//请求体
x_coord=11&y_coord=2&z_coord=1

可以看到请求参数在请求体中的体现是:x_coord=11&y_coord=2&z_coord=1,简单的解释一下上面的请求报文。

form-data

form-data 又是一种新的编码方式,它的请求报文为

POST /xxx/xxx HTTP/1.1    // 请求行
// 请求头
Host: 192.168.1.111:8080   
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="x_coord"

11111
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="y_coord"

111
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="z_coord"

11111
------WebKitFormBoundary7MA4YWxkTrZu0gW--

上面这个就是编码格式为 form-data 的时候的请求报文的样子。相比 x-www-form-urlencoded来说还是有点复杂。这种请求方式,会生成一个 boundary 界限来分隔请求参数。这种请求方式支持上传文件。一般需要上传文件的时候使用这种格式的编码方式,别的情况下,它相比别的编码方式缺点很明显,构造请求体的时候太复杂。需要你手动把构造体拼接成上面构造体的样式,服务器端才会接收到。其中 Volley 请求框架就没有封装这种编码方式的请求体,这也就说明了,为什么官方介绍 Volley 的时候说明,Volley 不支持 post 大数据,不适合上传文件了。如果你非要使用 Volley 的话那也可以,那你就自己定义一个 Request 重写 getBodyContentType 方法和 getBody 方法就可以了。这里就不介绍这一部分了,不是我们这里的重点。提示一下,可以仿照 Request 类

getbodyContentType.jpg

这里根据请求包中的编码方式修改一下。

然后 getBody 方法内修改一下请求体格式

application/json

这种请求体的编码方式也是很常见的。先看看请求报文

POST /xxx/xxx HTTP/1.1 
Host: 192.168.1.111:8080 
Content-Type: application/json
Cache-Control: no-cache

{"x_coord":11,"y_coord":22,"z_coord":33}

可以看到请求体的内容就是json 格式的。其中这种请求方式,Volley 为我们提供了 JsonObjectRequest 来实现。看看源码就知道了。很简单

这就是三种最常见的,也是我们需要掌握的 POST 请求方式。当然请求体还有很多其他类型的编码格式,都不常见,就不介绍了!

目录
相关文章
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
2月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
8月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
342 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
3月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
428 11
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
579 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
3月前
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
463 0
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
315 7
|
7月前
|
监控 应用服务中间件 Linux
掌握并发模型:深度揭露网络IO复用并发模型的原理。
总结,网络 I/O 复用并发模型通过实现非阻塞 I/O、引入 I/O 复用技术如 select、poll 和 epoll,以及采用 Reactor 模式等技巧,为多任务并发提供了有效的解决方案。这样的模型有效提高了系统资源利用率,以及保证了并发任务的高效执行。在现实中,这种模型在许多网络应用程序和分布式系统中都取得了很好的应用成果。
239 35
|
7月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
265 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
9月前
|
API 数据处理 Android开发
Android网络请求演变:从Retrofit到Flow的转变过程。
通过这个比喻,我们解释了 Android 网络请求从 Retrofit 到 Flow 的转变过程。这不仅是技术升级的体现,更是反映出开发者在面对并发编程问题时,持续探索和迭求更好地解决方案的精神。未来,还会有更多新的技术和工具出现,我们期待一同 witness 这一切的发展。
280 36

热门文章

最新文章