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 请求方式。当然请求体还有很多其他类型的编码格式,都不常见,就不介绍了!

目录
相关文章
|
11天前
|
并行计算 安全 网络协议
探索未来网络:量子互联网的原理与应用
本文深入探讨了量子互联网的基本概念、技术原理及其潜在应用。通过对量子纠缠、量子叠加和量子隐形传态等核心概念的解释,文章展示了量子互联网如何利用量子力学特性来实现超高速、超高安全性的通信。此外,还讨论了量子互联网在金融、医疗、国防等领域的应用前景,以及当前面临的技术挑战和未来的发展方向。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的奥秘:探索神经网络的核心原理
本文将深入浅出地介绍深度学习的基本概念,包括神经网络的结构、工作原理以及训练过程。我们将从最初的感知机模型出发,逐步深入到现代复杂的深度网络架构,并探讨如何通过反向传播算法优化网络权重。文章旨在为初学者提供一个清晰的深度学习入门指南,同时为有经验的研究者回顾和巩固基础知识。
46 11
|
1月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
84 8
|
3天前
|
人工智能 安全 网络协议
探索未来网络:量子互联网的原理与应用
本文深入探讨了量子互联网的基础原理、关键技术及其在未来通信领域的应用前景。通过分析量子纠缠、量子叠加等核心概念,揭示了量子互联网相较于传统互联网的优势所在。同时,文章还讨论了当前量子互联网领域面临的技术挑战和解决方案,为读者呈现了一个关于量子互联网的全面且深入的视角。
|
2月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
117 56
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的奥秘:探索神经网络背后的原理与实践
【9月更文挑战第29天】本文将带你深入理解深度学习的核心概念,从基础理论到实际应用,逐步揭示其神秘面纱。我们将探讨神经网络的工作原理,并通过实际代码示例,展示如何构建和训练一个简单的深度学习模型。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。
22 2
|
18天前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
31 2
|
1月前
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
82 12
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度剖析深度神经网络(DNN):原理、实现与应用
本文详细介绍了深度神经网络(DNN)的基本原理、核心算法及其具体操作步骤。DNN作为一种重要的人工智能工具,通过多层次的特征学习和权重调节,实现了复杂任务的高效解决。文章通过理论讲解与代码演示相结合的方式,帮助读者理解DNN的工作机制及实际应用。
|
27天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。