iOS之网络相关2:HTTP的通信过程

903 阅读5分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

想要使用HTTP协议向服务器索取数据,首先要了解HTTP通信的完整过程,主要分为两大步骤:

    1. 请求:客户端向服务器索要数据
    1. 响应:服务器返回给客户端响应的数据

869753-b33e78d6f8025145.png

1. HTTP通信过程之请求

HTTP协议规定,一个完整的有客户端给服务器的HTTP请求中包含请求行、请求头、请求体三个部分:\

  1. 请求行:包含了请求方法,请求URL,HTTP希望回忆版本
'Method: POST'  
'URL: http://sy.aerozhonghuan.com:81/test/qingqi/visitreport-agent-qk/getDropDownList' 
'Protocol: HTTP/1.1' 
  1. 请求头:包含了客户端请求的主机地址,对客户端的环境描述等信息
'Host: sy.aerozhonghuan.com:81' 

'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148' 
'Accept: application/json, text/javascript, */*;' 
'Accept-Language: zh-cn' // 客户端的语言环境 
'Accept-Encoding: gzip, deflate' // 客户端支持的数据压缩格式 
'cookie' // HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给服务器。
'Connection: keep-alive' // (HTTP/1.1协议开始默认进行持久连接)
'Referer: url' // 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
  1. 请求体:客户端发给服务器的具体数据
{token: "xxx", startDate: "2020-06-01", endDate: "2020-06-30"}

2. HTTP通信过程之 响应

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

  1. 状态行:包含了HTTP协议版本,状态码,短语(状态描述)
'Protocol: HTTP/1.1' 
'Status Code: 200'
'OK'
  1. 响应头:包含了对服务器的描述,对返回数据的描述
'Server: nginx/1.10.1' 
'Content-Type: application/json;charset=UTF-8' 
'Date: Sun, 28 Jun 2020 11:09:06 GMT' 
  1. 实体内容:服务器返回给客户端的具体数据
{"resultCode":200,"message":"OK","data":{"list":[{"value":1,"name":"大客户拜访"},{"value":2,"name":"代理商检核"}]}}
  1. 常见响应状态码 状态码 | 短语(状态描述) | 中文描述 | | --- | --------------------- | -------------------- | | 200 | OK | 请求成功 | | 300 | | 重定向 | | 400 | Bad Request | 客户端请求语法错误,服务器无法解析 | | 404 | Not Found | 服务端无法根据客户端的请求URL找到资源 | | 500 | Internal Server Error | 服务器内部错误,无法完成请求

3. 发送HTTP请求的方法

  1. 在HTTP/1.1协议中,定义了8种发送http请求的方法: HTTP请求方法 | 作用 | | -------- | -------------------------- | | GET | 查: 向服务器请求一个文件 | | POST | 改: 向服务器发送数据,让服务器进行修改更新 | | PUT | 增: 向服务器发送数据并存储在服务器内部 | | DELETE | 删: 从服务器删除数据 | | HEAD | 检查一个对象是否存在 | | CONNECT | 对通道提供支持 | | TRACE | 跟踪到服务器的路径 | | OPTIONS | 查询服务器的性能

  2. GET和POST请求

    1. GET和POST请求介绍
    • GET:在请求URL后面以?的形式拼接发给服务器的参数,多个参数之间用&隔开,参数长度有限。
    • POST:发给服务器的参数全部放在请求体中,理论上传递的数据量没有限制(具体要看服务器的处理能力)。
    1. GET和POST请求响应的不同
    • GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
    • 在响应时,GET产生一个TCP数据包;POST产生两个TCP数据包:
      • 对于GET方式的请求,浏览器会把Header和实体主体一并发送出去,服务器响应200(返回数据);
      • 而对于POST,浏览器先发送Header,服务器响应100 Continue,浏览器再发送实体主体,服务器响应200 OK(返回数据)。 3.GET和POST优缺点
    • GET优点:
      • 请求方便:直接用一个完整的路径去请求获取数据。
      • 对服务器来说比较安全:发送请求过程中不会发送请求体,不会破坏服务器的封装性。从这个角度来讲,GET相对于POST安全。
    • GET缺点:
      • 数据不安全:GET请求数据会暴露参数信息,任何人都可见。
      • 参数长度受限:GET方式通过直接拼接参数向服务器请求数据,网址输入的长度有上限,参数特别多的时候,会被截断。(注意:GET参数长度限制为2048个字符)
    • POST优点:
      • 数据安全:发送请求时,参数封装在请求体中发送,不会直接暴露参数信息。从这角度讲,POST相对GET安全一些。(注意:如果被抓包,明文参数一样不安全。)
      • 参数大小不受限:使用POST请求数据时,通过请求体来传递参数,参数的大小远远要大于通过GET方式传递的参数大小,比较灵活。
    • POST缺点:
      • 请求不方便:请求时要通过请求体发送参数,不如GET请求便捷。
      • 对服务器来说不安全:POST请求时,会向服务器发送请求体,破坏了服务器的封装性。从这个角度讲,相对于GET不安全。