iOS开发——HTTP协议详解

  • 什么是HTTP协议
  • URL
  • HTTP消息结构
  • HTTP方法
  • 状态码
  • Header Field
  • 请求体格式
  • 理解HTTP通讯方式

什么是HTTP协议

  • 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规则。
  • 超文本传输协议(HTTP)作为其中一种,它允许将超文本标记语言文档从web服务器传送给客户端。(由于使用MIME机制/多用途因特网邮件扩展,可以传输多种类型的文件)

URL

  • URL(Uniform Resource Locator / 统一资源定位符)用于标记一个网络上的资源。基本格式如下:
schema://login@host[:port#]/path/..../[?query-string][#anchor]

    /*
     scheme: 协议名(如http,https,ftp)
     login: 登陆信息
     host: 服务器IP/域名
     port#:HTTP服务的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080
     path: 资源路径
     query-string: 发送给web服务器的数据
     anchor: 片段标识符
     */
  • 一个例子:
http://www.mywebsite.com/sj/test/test.aspx?name=sivergn&x=true#stuff

    /*
     schema: http
     host: www.mywebsite.com
     path: /sj/test/test.aspx
     Query String: name=sviergn&x=true
     Anchor: stuff
     */

HTTP消息结构

请求消息/Request
GET http://www.cnblogs.com/  HTTP/1.1
Host:www.cnblogs.com
Request LineMETHOD/path-to-resource HTTP/version-number
Request HeaderField1 : Value
Request HeaderField2 : Value
空行空行
Request Bodydata(optional)
  • Request Line/请求行
    • Method:请求方法,如GET/POST。
    • path-to-resource:所请求的资源在web服务器上的路径
    • HTTP/version-number:HTTP协议版本号。
  • Request Header / 请求头,记录请求行以外的重要信息。
  • Request Body / 请求体,携带提交给web服务器的数据。使用GET方法时,为空。
    • 注意,Body和Header之间空一行
响应消息/Response
Response LineHTTP/version-number status-code message
Response HeaderField1 : Value
Response HeaderField2 : Value
空行空行
Response Bodydata(optional)
  • Response Line/响应行
    • HTTP/version-number:HTTP协议版本号。
    • status-code:状态码,反应服务器处理是否正常,告知出现的错误。
    • message:状态消息,同状态码对应。
  • Response Header / 响应头,记录响应体数据的相关信息。
  • Response Body / 响应体,携带需要向web服务器发送的数据。使用GET方法时,为空。
    • 注意,Body和Header之间空一行

HTTP方法

  • 用于告知服务器我的意图

    • GET,从服务器上获取特定资源
    • POST,上传请求体。
    • HEAD,获取关于特定资源的响应头
  • GET和POST方法的区别
  • 数据存放位置
  • GET:将数据放在URL之后,以?连接;参数之间以&进行拼接,例如:EditPosts.aspx?name=test1&id=12345
  • POST:数据放在Request Body中。
  • 数据大小限制
  • GET:所提交数据的大小有限制(因为浏览器对URL的长度有限制)。
  • POST:没有限制。
  • 安全性
  • GET:所提交的数据以明文的形式显示在URL上。
  • POST:由于保存在Request Body中,增加了安全系数。
  • 缓存
  • GET:缓存服务器返回的响应
  • POST:不缓存。

状态码

  • 由三位数字和状态消息组成:

    • 1XX(信息描述):接受的请求正在处理。
    • 2XX(成功状态):请求正常处理完毕。其中206表示请求部分内容成功/Range
    • 3XX(重定向状态):需要进行附加操作以完成请求。
    • 4XX(客户端错误):服务器无法处理请求。
    • 5XX(服务器错误):服务器处理请求出错。

Header Field

Request Header Field / 请求头域
  • User-Agent:客户端程序信息。
  • Range:获取资源的范围(从0开始,末尾位置为文件长度 - 1),单位字节:
    • bytes=500-1000,从500开始,下载到1000。
    • bytes=500-,从500开始下载,直至数据末尾。
    • bytes=-500,从0开始下载到500。
Response Header Field / 响应头域
  • Content-Length:Response Body数据的大小(字节)。
  • Keep-Alive:服务器端的超时限制/timeout,最大同时连接数/max
  • Content-Type:Response Body数据的的媒体类型(MIME)。注意,如果利用POST请求向服务器上传文件,则需遵从以下格式:

    /*
    1. form-data;和boundary=之间有一个空格。
    2. boundary=之后的内容可以是任意字符串。
    */
    multipart/form-data;(空格)boundary=---------------------------195362999817818974031690194806

请求体格式

  • 单个文件上传

    /*
    原始boundary以及头尾部boundary的不同之处:
     ---------------------------195362999817818974031690194806 // oriBoundary,设置在Content-Type中
    -----------------------------195362999817818974031690194806 // 头部boundary,--oriBoundary(前面2个-)
    -----------------------------195362999817818974031690194806-- // 尾部boundary,--oriBoundary--(前后都有2个--)
    */
    
    -----------------------------195362999817818974031690194806 // 头部boundary
    Content-Disposition: form-data; name="userfile"; filename="vcpg" // 内容属性,form-data; name="服务器用于接收文件的参数名": filename="文件被发送给服务器时所使用的名称"
    Content-Type: application/octet-stream // 万能文件类型
    // 空行
    // 文件内容开始
    //...
    // 文件内容结束
    -----------------------------195362999817818974031690194806-- // 尾部boundary,其紧贴文件内容的结尾
  • 上传多个文件 + 多个参数

    -----------------------------418888951815204591197893077 // 文件1的头部boundary
    Content-Disposition: form-data; name="userfile[]"; filename="文件1.md"
    Content-Type: text/markdown
    // 空行
    // 文件1内容开始
    // ...
    // 文件1内容结束
    -----------------------------418888951815204591197893077 // 文件2的头部boundary
    Content-Disposition: form-data; name="userfile[]"; filename="文件2"
    Content-Type: application/octet-stream
    // 空行
    // 文件2内容开始
    // ...
    // 文件2内容结束
    -----------------------------418888951815204591197893077 // 文件3的头部boundary
    Content-Disposition: form-data; name="userfile[]"; filename="文件3"
    Content-Type: application/octet-stream
    // 空行
    // 文件3内容开始
    // ...
    // 文件3内容结束
    -----------------------------418888951815204591197893077 // 参数username的头部boundary
    Content-Disposition: form-data; name="username"
    
    zhangsan
    -----------------------------418888951815204591197893077 // 参数password的头部boundary
    Content-Disposition: form-data; name="password"
    
    zhangxx
    -----------------------------418888951815204591197893077-- // 尾部boundary,表示结束

理解HTTP通讯方式

  • 客户端和服务器的通讯是有来有回的,而且总是以客户端首先发起请求服务器进行响应的形式发生。
  • 所谓通讯就是传输数据,根据数据的大小,可以将其分为三种类型:(c表示客户端;s表示服务器)
    • c小:s小,适用方法GET / POST。
    • c小:s大,适用方法GET / POST。
    • c大:s小,适用方法POST。
  • 注意,对于客户端来说,不管是上传还是下载大数据,都需要解决内存管理问题


文/fever105(简书作者)
原文链接:http://www.jianshu.com/p/abaf583f1183
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值