HTTP

HTTP:HyperText Transfer Protocol,超文本传输协议
该协议是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个客户端和服务器端请求和应答的标准。客户端通过使用Web浏览器、网络爬虫或者其它的工具发起一个HTTP请求到服务器上的指定端口(默认端口为80),应答的服务器上存储着资源,如HTML文件和图像,给予客户端资源的应答。

-特点:

  1. 支持客户/服务器模式
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。常用的方法有GET、HEAD、POST。每种方法规定了客户和服务器联系的类型不同。HTTP服务器的程序规模小,因而通信速度很快
  3. 灵活:HTTP允许传输任意类型的数据对象,正则传输的类型由Content-Type加以标记
  4. 无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可节省传输时间
  5. 无状态:指协议对于事物处理没有记忆功能,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

-工作流程

(1)首先客户机与服务器需要建立连接,只要单击某个超链接,HTTP的工作开始
(2)建立连接后,客户机发送请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,MIME信息(包括请求修饰符、客户机信息和可能的内容)
(3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息(包括服务器信息、实体信息和可能的内容)
(4)客户端接收服务器所返回的信息通过浏览器显⽰示在用户的显示屏上,然后客户机与服务器断开连接。

HTTP协议通常承载在TCP协议上,有时也承载于TLS或SSL协议层上,这时就是常说的HTTPS;HTTP协议永远是客户端发起请求,服务器端回送响应;同一个客户端的本次请求和上次请求没有对应关系

-重要概念

  • 连接:Connection,一个传输层的实际环流,它建立在两个相互通讯的应用程序之间。
  • 消息:Message,HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
  • 请求:Request,一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
  • 响应:Response,一个从服务器返回的信息包括HTTP协议的版本号、请求的状态和文档的MIME类型
  • 资源:Resource,由URI标识的网络数据对象或服务
  • 实体:Entity,数据资源或来自服务资源的回应的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容
  • 客户机:Client,一个为发生请求目的而建立连接的应用程序
  • 用户代理:UserAgent,初始化一个请求的客户机。它们是浏览器、编辑器或其他用户工具
  • 服务器:Server,一个接受连接并对请求返回信息的应用程序
  • 源服务器:Originserver,一个给定资源可以在其上驻留或被创建的服务器
  • 代理:Proxy,一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其他客户机建立请求。一个代理在发生请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求
  • 网关:Gateway,一个作为其他服务器中间媒介的服务器,与代理不同的是,网关接受请求就好像对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源
  • 通道:Tunnel,是作为两个连接中继的中介程序,一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
  • 缓存:Cache,反应信息的局域存储

-HTTP请求详解

HTTP请求由三部分组成:请求行、请求头、请求正文

HTTP的8种请求方式:

  • OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法
  • GET 向特定的资源发出请求
  • POST 向特定资源提交数据进行处理请求(例如提交表单或上传文件)数据被包含在请求体中
  • HEAD 向服务器索要于GET请求相一致的响应,只不过响应体不会被返回
  • PUT 向指定资源位置上传其最新内容
  • DELETE 请求服务器删除Request-URL所标识的资源
  • TRACE 回显服务器收到的请求,主要用于测试或诊断
  • CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

-请求内容:

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

  • 请求行:包含了请求方法、请求资源路径、HTTP协议版本。
    eg:GET /v2/movie/us_box HTTP/1.1
  • 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
    eg: Host: api.douban.com: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协议版本、状态码、状态英文名称
  • 响应头:包含了对服务器的描述、对返回数据的描述
  1. Server: nginx // 服务器的类型 2.
  2. Content-Type: application/json; charset=utf-8 // 返回数据的类型
  3. Content-Length: 21670 // 返回数据的长度
  4. Date: Sat, 19 Sep 2015 05:02:56 GMT // 响应的时间
  • 实体内容:服务器返回给客户端的具体数据,比如文件数据

每个请求或响应消息中都包含着头域,每个头域由一个域名,冒号和域值三部分组成。域名大小写无关,域值前可以添加任何数量的空格符,头域可被扩展为多行,在每行开始处,使用至少一个空格或制表符。

下面举例构建HTTP的GET请求:
1.从NSURL中解析出服务器的IP地址

//1.通过url获取host
NSString *host = url.host;

//2.通过host解析ip地址
struct hostent *host_ip = gethostbyname([host UTF8String]);

//获取ip地址
struct in_addr **addrList = (struct in_addr **)host_ip->h_addr_list;
for (int i = 0; addrList[i]!=NULL; i++) {
    NSLog(@"ip is:%s",inet_ntoa(*addrList[i]));
}

NSString *ip = [NSString stringWithCString:inet_ntoa(*addrList[0]) encoding:NSUTF8StringEncoding];

//3.获取端口号
NSNumber *port = url.port;

2.构建HTTP的GET请求
例子:图片中内容即是GET请求行,我们要拼接出下面的内容

002WV0d1zy71abHquRGf8&690.jpeg

注意:

  • 一定要换行,换行符为 \r\n
  • 第一行分别表示请求方式,请求路径,HTTP协议版本
  • 第二行表示后面的文档属于什么类型
  • 第三行表示主机域名
  • 第四行表示连接完毕后关闭连接。因为HTTP1.1版本默认对方支持长连接,如果不希望长连接则需要标明
  • 第五行表示客户端浏览器内核版本,服务器可以根据这个参数返回不同数据格式

使用NSString拼接:

//拼接请求信息   \r\n == 换行
NSString *sendMsg = [NSString stringWithFormat:@"GET %@ HTTP/1.1\r\n",url.path];

sendMsg = [sendMsg stringByAppendingFormat:@"Host: %@\r\n",url.host];

sendMsg =[sendMsg stringByAppendingString:@"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\r\n"];

sendMsg =[sendMsg stringByAppendingString:@"Content-Encoding: utf-8\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"Connection: close\r\n"];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容