Date
Dec. 22nd, 2024
 
2024年 11月 22日

Post: iOS 入门 020: HTTP 浅析

iOS 入门 020: HTTP 浅析

Published 12:04 Apr 20, 2012.

Created by @ezra. Categorized in #Programming, and tagged as #iOS.

Source format: Markdown

Table of Content

URL

  • URL的全称是Uniform Resource Locator(统⼀资源定位符)
  • 通过一个URL,能找到互联⽹上唯⼀的一个资源,依赖于网络资源,不能随意更改
  • URL就是资源的地址、位置,互联⽹上的每个资源都有一个唯一的URL
  • URL的基本格式 = 协议: //主机地址/路径

协议

  • 不同的协议,代表着不同的资源查找⽅方式、资源传输⽅方式

主机地址

  • 存放资源的主机的IP地址(域名)

路径

  • 资源在主机中的具体位置

URL中常见的协议

HTTP

  • 超⽂文本传输协议,访问的是远程的网络资源,格式是https://

  • http协议是在⽹网络开发中最常⽤用的协议

file

  • 访问的是本地计算机上的资源,格式是file://(不⽤用加主机地址)

mailto

  • 访问的是电⼦子邮件地址,格式是mailto:

FTP

  • 访问的是共享主机的⽂文件资源,格式是ftp://

HTTP协议简介

  • 不管是移动客户端还是PC端,访问远程的⽹网络资源经常使⽤用HTTP协议
    • 访问百度主页:https://www.baidu.com
    • 获得新浪的微博数据
    • 获得⼤大众点评的团购数据
  • HTTP的全称是Hypertext Transfer Protocol,超⽂文本传输协议
    • 规定客户端和服务器之间的数据传输格式
    • 让客户端和服务器能有效地进⾏行数据沟通
  • 特点
    • 因为HTTP协议简单,所以HTTP服务器的程序规模⼩小,因⽽而通信速度很快
    • HTTP允许传输任意类型的数据
  • HTTP 0.9和1.0使⽤用⾮非持续连接,限制每次连接只处理⼀一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种⽅方式可以节省传输时间

HTTP通信

  • 请求
    • 客户端向服务器索要数据 实作
  • 响应
    • 服务器返回客户端相应的数据

iOS常见发送HTTP请求的方案

  • 苹果原⽣生(⾃带)
    • NSURLConnection
      • ⽤用法简单,最古⽼老最经典最直接的一种方案
    • NSURLSession
      • iOS 7新出的技术,功能⽐比NSURLConnection更加强⼤大
    • CFNetwork
      • NSURL*的底层,纯C语⾔
  • 第三⽅方框架

    • ASIHttpRequest
      • 外号"HTTP终结者",功能极其强⼤大,可惜早已停止更新
    • AFNetworking
      • 简单易⽤用,提供了基本够⽤用的常⽤用功能,维护和使⽤用者多
    • MKNetworkKit
      • 简单易⽤用,产⾃印度,维护和使⽤用者少
  • 为了提⾼高开发效率,企业开发⽤用的基本是第三⽅框架

  • ASI和AFN架构对⽐

发送HTTP请求的方法

  • 在HTTP/1.1协议中,定义了8种发送HTTP请求的⽅法

    • GET
    • POST
    • OPTIONS
    • HEAD
    • PUT
    • DELETE
    • TRACE
    • CONNECT
    • PATCH
  • 根据HTTP协议的设计初衷,不同的方法对资源有不同的操作⽅式

    • PUT:增
    • ⌫:删
    • POST:改
    • GET:查
  • 最常⽤的是GET和POST(实际上GET和POST都能办到增删改查)
  • 要想使用GET和POST请求跟服务器进⾏行交互,得先了解⼀个概念
  • 参数
    • 就是传递给服务器的具体数据,⽐如登录时的帐号、密码

GET和POST对⽐

  • GET和POST的主要区别表现在数据传递上
  • GET
    • 在请求URL后面以?的形式跟上发给服务器的参数,后面跟上值,多个参数之间⽤&隔开,⽐如
      • https://ww.test.com/login?username=123&pwd=234&type=JSON
    • 由于浏览器和服务器对URL长度有限制,因此在URL后⾯面附带的参数是有限制的,通常不能超过1KB
  • POST
    • HTTPMethod = @"POST";默认为GET
    • 只是从服务器拿数据,URL中不需要发送任何额外信息
    • 发给服务器的参数全部放在请求体中
      • HTTPBody = [NSString stringWithFormat:@"username=aaa&pwd=bbb",username,pwd];
    • 理论上,POST传递的数据量没有限制(具体还得看服务器的处理能⼒)

GET和POST的选择

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

序列化

  • 要将程序中使用的对象发送给服务器之前,转换为二进制数据的过程,将对象转换为0101类型的数据,就能够在网络上传输了

反序列化

  • 将从服务器获取到的二进制数据转换为OC对象的过程,将0101类型的数据

JSON解析

  • 将特殊格式的字符串(NSData)直接转换为NSArray或者NSDictionary
  • 苹果原生
    • NSJSONSerialization性能最好
    • 选项参数
      • NSJSONReadingMutableContainers = 1
      • NSJSONReadingMutableLeaves = (1UL << 1)
      • NSJSONReadingAllowFragments = (1UL << 2)
  • 第三方框架
    • JSONKit性能最好
    • SBJson性能中等
    • TouchJSON性能略差

HTTP通信过程(请求)

  • HTTP协议规定,一个完整的由客户端发给服务器的HTTP请求中包含以下内容
    • 请求⾏行
      • 包含了请求⽅方法、请求资源路径、HTTP协议版本
        • GET /MJServer/resources/images/1.jpg HTTP/1.1
    • 请求头
      • 包含了对客户端的环境描述、客户端请求的主机地址等信息
        • Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
        • User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0 // 客户端的类型,客户端的软件环境
        • Accept: text/html, */* // 客户端所能接收的数据类型
        • Accept-Language: zh-cn // 客户端的语⾔言环境`
        • Accept-Encoding: gzip // 客户端⽀支持的数据压缩格式
    • 请求体
      • 客户端发给服务器的具体数据,⽐比如⽂文件数据

HTTP通信过程(响应)

  • 客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
  • HTTP协议规定,一个完整的HTTP响应中包含以下内容
    • 状态⾏行
      • 包含了HTTP协议版本、状态码、状态英⽂文名称
        • HTTP/1.1 200 OK
    • 响应头
      • 包含了对服务器的描述、对返回数据的描述
        • Server: Apache-Coyote/1.1 // 服务器的类型
        • Content-Type: image/jpeg // 返回数据的类型
        • Content-Length: 56811 // 返回数据的长度
        • Date: Mon,23 Jun 2014 12:54:52 GMT // 响应的时间
    • 实体内容:服务器返回给客户端的具体数据,⽐如⽂件数据
Pinned Message
HOTODOGO
The Founder and CEO of Infeca Technology.
Developer, Designer, Blogger.
Big fan of Apple, Love of colour.
Feel free to contact me.
反曲点科技创始人和首席执行官。
开发、设计与写作皆为所长。
热爱苹果、钟情色彩。
随时恭候 垂询