iOS - NetRequest 网络数据请求

本文详细介绍了iOS中网络请求的相关知识,包括网络通讯三要素(IP地址、端口号、传输协议)、HTTP请求的通信机制、请求格式、响应格式,以及iOS的网络请求设置和文件上传下载等内容。重点讲解了HTTP请求头和响应头的各个字段,以及GET和POST方法的区别。此外,还探讨了iOS App Transport Security的安全设置和网络请求的基本设置。
摘要由CSDN通过智能技术生成

1、网络请求

1.1 网络通讯三要素

  • 1、IP 地址(主机名):

    • 网络中设备的唯一标示。不易记忆,可以用主机名(域名)。

    • 1) IP V4:

      • 0~255.0~255.0~255.0~255 ,共有 2^8^4 = 2^32 = 42 亿。
    • 2) 本地回环地址:

      • 每台机器都有自己的本地回环地址,ip 为 127.0.0.1 ,主机名为 localhost。如果 127.0.0.1 ping 不通,则网卡不正常。

      • 本地 hosts 文件修改,终端:

        • $ cd /etc
        • $ sudo vim hosts
        • $ 输入密码进入 hosts 文件编辑界面
        • $ 将光标移动到指定位置
          - 英文输入模式下按 i 键进入编辑状态,
          - 英文输入模式下按 esc 键进入命令状态,
          - 在命令状态下输入 :wq 回车,保存退出 hosts 文件。
  • 2、端口号:

    • 用于标示进程的逻辑地址,不同进程的标示。
    • 有效端口为 0 ~ 65535,其中 0 ~ 1024 由系统使用或者保留端口,开发中不要使用 1024 以下的端口。

    • 1) Netcat 的使用:

      • Netcat 是 Mac 终端下用于调试和检查网络的工具包,可用于创建 TCP/IP 连接。
      • 终端:$ nc -lk 12345,开启监听,终端将始终监听本地计算机 12345 端口的数据。
  • 3、传输协议(通讯的规则):

    • 1) TCP:传输控制协议:

      • 建立连接,形成传输数据的通道(建立连接的三次握手,断开连接的四次握手)。
      • 在连接中进行大数据传输,数据大小不收限制。
      • 通过三次握手完成连接,是可靠协议,数据安全送达。
      • 必须建立连接,效率会稍低。
    • 2) UDP:用户数据报协议:

      • 只管发送,不确认对方是否接收到。
      • 不需要建立连接,将数据及源和目的封装成数据包中,每个数据报的大小限制在 64K 之内。
      • 因为无需连接,因此是不可靠协议。
      • 不需要建立连接,速度快。
      • 应用场景:多媒体教室/网络流媒体。
    • 3) 常见网络协议:

      应用层协议       |      端口       |              说明

      -----------------|----------------|---------------------------------
      HTTP | 80 | 超文本传输协议
      HTTPS | 443 | HTTP+SSL,HTTP 的安全版
      FTP | 20, 21, 990 | 文件传输
      POP3 | 110 | 邮局协议
      SMTP | 25 | 简单邮件传输协议
      telnet | 23 | 远程终端协议

1.2 网络参考模型

ISO 参考模型 TCP/IP 参考 说明
应用层 应用层 FTP,HTTP,TELNET,SMTP,DNS 等协议
表示层
会话层
传输层 传输层 Socket 开发,TCP 协议,UDP 协议
网络层 网络互连层 路由器,IP 协议,ICMP 协议,ARP 协议,RARP 协议和 BOOTP 协议
数据链路层 网络接口层 交换机
物理层 网线

1.3 HTTP 请求

  • HTTP(HyperText Transfer Protocol 超文本传输协议)是一套计算机通过网络进行通信的规则。计算机专家设计出 HTTP,使 HTTP 客户(如 Web 浏览器)能够从 HTTP 服务器(Web 服务器)请求信息和服务。HTTP 是一种无状态的协议,无状态是指 Web 浏览器和 Web 服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后 Web 服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。HTTP 遵循请求(Request)/应答(Response)模型。Web 浏览器向 Web 服务器发送请求,Web 服务器处理请求并返回适当的应答。所有 HTTP 连接都被构造成一套请求和应答。

1.3.1 HTTP 通信机制

  • HTTP 通信机制是在一次完整的 HTTP 通信过程中,Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:

  • 1、建立 TCP 连接

    • 在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是 80。
  • 2、Web 浏览器向 Web 服务器发送请求命令

    • 一旦建立了 TCP 连接,Web 浏览器就会向 Web 服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1
  • 3、Web 浏览器发送请求头信息

    • 浏览器发送其请求命令之后,还要以头信息的形式向 Web 服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
  • 4、Web 服务器应答

    • 客户机向服务器发出请求后,服务器会给客户机回送应答,HTTP/1.1 200 OK,应答的第一部分是协议的版本号和应答状态码。
  • 5、Web 服务器发送应答头信息

    • 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
  • 6、Web 服务器向浏览器发送数据

    • Web 服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据。
  • 7、Web 服务器关闭 TCP 连接

    • 一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加入了这行代码,Connection:keep-alive,TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

1.3.2 HTTP 请求格式

  • 当浏览器向 Web 服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP 请求信息由 3 部分组成:

    • 请求行:请求方法 请求路径 协议/版本
    • 请求头
    • 请求体

    • 如:

          GET /videos.jsp HTTP/1.1                   // 请求行
          Host: localhost                            // 请求头
          User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* / *;q=0.8
          Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
          Accept-Encoding: gzip, deflate
          Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
          Connection: keep-alive
      
          username=jinqiao&password=1234             // 请求体
  • 1、请求行:

    • 请求的第一行,其组成为:请求方法 请求路径 协议/版本

      • 请求行 :GET /videos.jsp HTTP/1.1

      • 请求方法 :GET
      • 请求路径 :/videos.jsp
      • 协议/版本:HTTP/1.1

    • (1) 请求方法:

      • 根据 HTTP 标准,HTTP 请求可以使用多种请求方法。例如:HTTP1.1 支持 7 种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TARCE。在 Internet 应用中,最常用的方法是 GET 和 POST。

      • GET 方法:

        • GET 方法是默认的 HTTP 请求方法,通过请求 URL 得到资源。我们日常用 GET 方法来提交表单数据,然而用 GET 方法提交的表单数据只经过了简单的编码,同时它将作为 URL 的一部分向 Web 服务器发送,因此,如果使用 GET 方法来提交表单数据就存在着安全隐患上。例如:

          Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

        • 从上面的 URL 请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于 GET 方法提交的数据是作为 URL 请求的一部分所以提交的数据量不能太大。

      • POST 方法:

        • POST 方法是 GET 方法的一个替代方法,用于添加新的内容。它主要是向 Web 服务器提交表单数据,尤其是大批量的数据。POST 方法克服了 GET 方法的一些缺点。通过 POST 方法提交表单数据时,数据不是作为 URL 请求的一部分而是作为标准数据传送给 Web 服务器,这就克服了 GET 方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用 POST 方法。

        • 从编程的角度来讲,如果用户通过 GET 方法提交数据,则数据存放在 QUERY_STRING 环境变量中,而 POST 方法提交的数据则可以从标准输入流中获取。

      • DELETE:删除某个内容
      • CONNECT:用于代理进行传输,如使用 SSL
      • OPTIONS:询问可以执行哪些方法
      • PATCH:部分文档更改
      • PROPFIND, (wedav):查看属性
      • PROPPATCH, (wedav):设置属性
      • MKCOL, (wedav):创建集合(文件夹)
      • COPY, (wedav):拷贝
      • MOVE, (wedav):移动
      • LOCK, (wedav):加锁
      • UNLOCK (wedav):解锁
      • TRACE:用于远程诊断服务器
      • PUT :改
      • HEAD:类似于 GET, 只返回响应,不返回实体数据,用于检查对象是否存在,以及得到对象的元数据,下载数据前使用

      • apache2 中,可使用 Limit,LimitExcept 进行访问控制的方法包括:GET, POST, PUT, DELETE, CONNECT,OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE,LOCK, 和 UNLOCK。其中, HEAD GET POST OPTIONS PROPFIND 是和读取相关的方法,MKCOL PUT DELETE LOCK UNLOCK COPY MOVE PROPPATCH 是和修改相关的方法。

    • (2) 请求路径:

      • 请求路径(URI) 完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以 “/” 开头,最后,协议版本声明了通信过程中使用 HTTP 的版本。
    • (3) 协议/版本:

      • HTTP/1.1
  • 2、请求头:

    • 请求头包含许多有关客户端环境和请求体的有用信息。例如,请求头可以声明浏览器所用的语言,请求体的长度等。当我们打开一个网页时,浏览器要向网站服务器发送一个 HTTP 请求头,然后网站服务器根据 HTTP 请求头的内容生成当次请求的内容发送给浏览器。

          Host: localhost                                                              // 请求主机
          User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0   // 告诉服务器客户端的类型
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8      // 告诉服务器客户端支持的格式
          Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3                         // 告诉服务器客户端的语言
          Accept-Encoding: gzip, deflate                                               // 告诉服务器客户端支持的压缩格式
          Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7                                   // 告诉服务器客户端字符编码
          Connection: keep-alive                                                       // 告诉服务器连接类型
          Content-Length: 4817                                                         // 提交给服务器的内容长度
          Content-Type: text/html                                                      // 提交给服务器的内容类型
          Authorization: authorString                                                  // 访问服务器的验证信息
          Range: bytes=0-499                                                           // 指定要返回的数据范围
    • (1) Host

      • 表示请求的服务器网址。请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的。

      • 例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html,浏览器发送的请求消息中,就会包含 Host 请求报头域,如下:Host:http://www.guet.edu.cn,此处使用缺省端口号 80,若指定了端口号,则变成:Host:指定端口号

    • (2) User-Agent

      • 告诉 HTTP 服务器,客户端使用的操作系统和浏览器的名称和版本。

      • User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

      • 例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

    • (3) Accept

      • 告诉服务器浏览器端可以接受的媒体类型。

      • 客户端支持的 MIME 类型分别是 text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8,优先顺序是它们从左到右的排列顺序。

      • text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。

        • text :用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
        • text/html :表示 html 文档;

        • application :用于传输应用程序数据或者二进制数据;
        • application/xhtml+xml :表示 xhtml 文档;
        • application/xml :表示 xml 文档。

      • q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其 “;” 之前的类型表示的内容。
        • 若没有指定 q 值,则默认为 1。
        • 若被赋值为 0,则用于提醒服务器哪些是浏览器不接受的内容类型。
    • (4) Accept-Language

      • 告诉服务器浏览器申明自己接收的语言。

      • 语言跟字符集的区别:中文是语言,中文有多种字符集,比如 big5,gb2312,gbk 等等;

      • 例如:Accept-Language: en-us

      • zh-cn :表示简体中文
      • zh :表示中文

    • (5) Accept-Encoding

      • 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

      • 例如:Accept-Encoding: gzip, deflate

      • gzip :是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式
      • deflate :是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法

    • (6) Accept-Charset

      • 浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如 gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);

      • GB2312 :是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称 GB0,由中国国家标准总局发布,1981年5月1日实施
      • utf-8 :是 Unicode 的一种变长字符编码又称万国码,由 Ken Thompson 于 1992 年创建,现在已经标准化为 RFC 3629
      • * :表示任意字符编码,虽然 q 都是等于 0.7,但明确指定的 GB2312,utf-8 比 * 具有更高的优先级

    • (7) Connection

      • 告诉服务器连接类型。

      • Connection:Keep-Alive :表示持久连接,长连接。当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

      • Connection:close :代表一个 Request 完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接会关闭,当客户端再次发送 Request,需要重新建立 TCP 连接。

      • 长连接:连上服务器就不断开。双方传递数据,不需要再次建立连接。

        • 优点:效率高,通常只有非常有钱的公司,才会提供长连接的服务。比如:apple 的消息推送服务就是长连接。
        • 缺点:用户体验不好,而且服务器的负担很重。
      • 短连接:连上服务器,获取完数据,就立即断开。HTTP 访问,都是短连接,使用情况非常多。

    • (8) Content-Length

      • 发送给HTTP服务器数据的长度。

      • 例如: Content-Length:38

    • (9) Content-Type

      • 提交给服务器的内容类型

      • 例如:Content-Type: application/x-www-form-urlencoded

    • (10) Authorization

      • 访问服务器的验证信息
    • (11) Range

      • 指定要返回的数据范围

      • - :用于分隔,前面的数字表示起始字节数,后面的数组表示截止字节数,没有表示到末尾。

        • 如:bytes=0-499 从 0 到 499 的头 500 个字节,bytes=500- 从 500 字节以后的所有字节
      • , :用于分组,可以一次指定多个 Range,不过很少用。

        • 如:bytes=500-599,800-899 同时指定几个范围
    • (12) Referer

      • 提供了 Request 的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从 HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

      • 例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

    • (13) Pragma

      • 防止页面被缓存,在 HTTP/1.1 版本中,它和 Cache-Control:no-cache 作用一模一样,Pargma 只有一个用法,

      • 例如:Pragma:no-cache

    • (14) Cookie

      • 最重要的 header, 将 cookie 的值发送给 HTTP 服务器。
  • 3、请求体:

    • 请求头和请求体之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求体。请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值