您好,欢迎来到源码搜藏网!分享精神,快乐你我!
[加入VIP] 设为首页 | 收藏本站 | 网站地图 | Sitemap | TAG标签
  • 首 页
  • 在线工具
  • jquery手册
  • 当前位置:首页 > 安卓源码 > 技术博客 >

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

    时间:2019-01-24 23:05 来源:互联网 作者:源码搜藏 浏览:收藏 挑错 推荐 打印

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

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

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

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

    <请求头>

    <请求体>

    其中协议规定了 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 类

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

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

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

    Android 网络请求原理以及原始数据包转载http://www.codesocang.com/appboke/39502.html
    标签:网站源码