网络的重要性就不说了,🌚

扯个蛋先

在移动互联网时代,移动应用的特征有

  • 几乎所有应用都需要用到网络,比如 QQ、微博、网易新闻、优酷、百度地图
  • 只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜、活力
  • 如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水

移动网络应用 = 良好的 UI + 良好的用户体验 + 实时更新的数据

  • 新闻:网易新闻、新浪新闻、搜狐新闻、腾讯新闻
  • 视频:优酷、百度视频、搜狐视频、爱奇艺视频
  • 音乐:QQ音乐、百度音乐、酷狗音乐、酷我音乐
  • LBS:百度地图、高德地图、大众点评、墨迹天气、滴滴打车
  • 电商:淘宝、京东商城、天猫、蘑菇街、凡客诚品、美丽说
  • 社交:QQ、微信、微博、陌陌、比邻

so,为什么要学习网络编程?

  • 网络编程是一种实时更新应用数据的常用手段
  • 网络编程是开发优秀网络应用的前提和基础

在网络编程中,有几个必须掌握的基本概念

  • 客户端(Client):移动应用(iOS、Android 等应用)
  • 服务器(Server):为客户端提供服务、提供数据、提供资源的机器
  • 请求(Request):客户端向服务器索取数据的一种行为
  • 响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端

作为移动开发工程师,主要的精力都是放在客户端开发。

客户端和后端的恩怨情仇

按照软件开发阶段来分,服务器可以大致分为 2 种

  • 远程服务器
    • 别名:外网服务器、正式服务器
    • 使用阶段:应用上线后使用的服务器
    • 使用人群:供全体用户使用
    • 速度:取决于服务器的性能、用户的网速
  • 本地服务器
    • 别名:内网服务器、测试服务器
    • 使用阶段:应用处于开发、测试阶段使用的服务器
    • 使用人群:仅供公司内部的开发人员、测试人员使用
    • 速度:由于是局域网,所以速度飞快,有助于提高开发测试效率

网络中部署着各种各样的服务器,比如腾讯的服务器、百度的服务器,那么客户端如何找到想要连接的服务器?

  • 客户端通过 URL 找到想要连接的服务器

URL

  • URL 的全称是 Uniform Resource Locator(统一资源定位符)
  • 通过 1 个 URL,能找到互联网上唯一的 1 个资源
  • URL 就是资源的地址、位置,互联网上的每个资源都有一个唯一的 URL

格式如下:

URL 的基本格式

对于上面所说的协议,URL 常见的协议有以下几种:

  • HTTP:超文本传输协议,访问的是远程的网络资源,格式是 http://**,http 协议是在网络开发中最常用的协议
  • file:访问的是本地计算机上的资源,格式是 file://(不用加主机地址)
  • mailto:访问的是电子邮件地址,格式是 mailto:
  • FTP:访问的是共享主机的文件资源,格式是 ftp://

HTTP 协议

HTTP 的全称是 Hypertext Transfer Protocol,超文本传输协议。

作用

  • 规定客户端和服务器之间的数据传输格式
  • 让客户端和服务器能有效地进行数据沟通

HTTP 协议

特点

为什么要选择 HTTP 协议呢?原因有以下几个:

  • 简单快速:因为 HTTP 协议简单,所以 HTTP 服务器的程序规模小,因而通信速度很快
  • 灵活:HTTP 允许传输各种各样的数据
  • HTTP/1.0 使用非持续连接(0.9 已过时):限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
  • HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP 的基本通信过程

要想使用 HTTP 协议向服务器索取数据,得先了解 HTTP 的通信过程,完整的 HTTP 通信可以分为 2 大步骤(如上图):

  • 请求(这里是 HTTP 请求):客户端向服务器索要数据
  • 响应(这里是 HTTP 响应):服务器返回客户端相应的数据

发送 HTTP 请求的方法

在 HTTP/1.1 协议中,定义了 8 种发送 HTTP 请求的方法:GETPOST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH。根据 HTTP 协议的设计初衷,不同的方法对资源有不同的操作方式。

  • PUT :增,比如文件的上传等
  • DELETE :删,比如删除服务器的某些文件
  • POST:改,比如修改用户名密码等
  • GET:查,比如获取新闻数据之类的

最常用的是 GET 和 POST(实际上 GET 和 POST 都能办到增删改查)

要想使用 GET 和 POST 请求跟服务器进行交互,得先了解一个概念参数(请求参数):就是传递给服务器的具体数据,比如登录时的帐号、密码等。

具体说说 GET 和 POST 之间的一些恩怨情仇。

GET 和 POST 的对比

主要是表现在数据传递上。

  • GET
    • 发给服务器的参数全部放在 URL 后面
    • 在请求 URL 后面以 ? 的形式跟上发给服务器的参数,多个参数之间用 & 隔开,比如 http://ww.test.com/login?username=123&pwd=234&type=JSON
    • 由于浏览器和服务器对 URL 长度有限制,因此在 URL 后面附带的参数是有限制的,通常不能超过 1KB
  • POST
    • 发给服务器的参数全部放在请求体中
    • 理论上,POST 传递的数据量没有限制(具体还得看服务器的处理能力)

GET 和 POST 选用的建议

  • 如果要传递大量数据,比如文件上传,只能用 POST 请求
  • GET 的安全性比 POST 要差些,如果包含机密\敏感信息,建议用 POST(有时候还需要加密、签名等)
  • 如果仅仅是索取数据(数据查询),建议使用 GET
  • 如果是增加、修改、删除数据,建议使用 POST

在 iOS 中发送 HTTP 请求的方案

  • 苹果原生(自带)
    • NSURLConnection:用法简单,最古老最经典最直接的一种方案(坑比较多)DEPRECATED: The NSURLConnection class should no longer be used. NSURLSession is the replacement for NSURLConnection.
    • NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术(2013 推出,iOS7 开始出的技术)
    • CFNetwork:NSURL* 的底层,纯 C语言(NSURLConnection 和 NSURLSession 都是基于它)
  • 第三方框架
    • ASIHttpRequest:外号 『HTTP 终结者』,功能极其强大,可惜早已停止更新
    • AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多
    • MKNetworkKit:简单易用,产自三哥的故乡印度,维护和使用者少

建议:为了提高开发效率,企业开发用的基本是第三方框架。

HTTP 通信过程

  • 请求

    HTTP 协议规定,1 个完整的由客户端发给服务器的 HTTP 请求中包含以下内容:

    • 请求头:包含了对客户端的环境描述、客户端请求信息等
    • GET /minion.png HTTP/1.1 // 包含了请求方法、请求资源路径、HTTP 协议版本
      • Host: 120.25.226.186:32812 // 客户端想访问的服务器主机地址
    • User-Agent: Mozilla/5.0 // 客户端的类型,客户端的软件环境
    • Accept: text/html, xx/xx // 客户端所能接收的数据类型
      • Accept-Language: zh-cn // 客户端的语言环境
      • Accept-Encoding: gzip // 客户端支持的数据压缩格式

    请求体:客户端发给服务器的具体数据,比如文件数据(POST 请求才会有)

  • 响应

    客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端,HTTP 协议规定,1 个完整的 HTTP 响应中包含以下内容:

    • 响应头:包含了对服务器的描述、对返回数据的描述
    • HTTP/1.1 200 OK // 包含了 HTTP 协议版本、状态码、状态英文名称
      • Server: Apache-Coyote/1.1 // 服务器的类型
        • Content-Type: image/jpeg // 返回数据的类型
        • Content-Length: 56811 // 返回数据的长度
      • Date: Mon, 23 Jun 2014 12:54:52 GMT// 响应的时间

    响应体:服务器返回给客户端的具体数据,比如文件数据

HTTP 通信过程可以用下图表示:

HTTP 通信过程

附:常见响应状态码

状态码 英文名称 中文描述
200 OK 请求成功
400 Bad Request 客户端请求的语法错误,服务器无法解析
404 Not Found 服务器无法根据客户端的请求找到资源
500 Internal Server Error 服务器内部错误,无法完成请求