Http基础

这篇文章是讲Android网络请求的先导文章,主要讲Http工作流程,请求报文和响应报文的格式,以及GETPOST方法的具体含义。

Http工作流程

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

这里我们规定下文讨论的HTTP都是基于tcp协议的,至于为什么不是udp,原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

我们用一个例子来说明http在通信的时候IP, TCP, DNS分别做了什么工作。

客户端发起请求,想要浏览百度这个网页,他先告诉DNS,获取百度这个网页的IP地址,然后HTTP协议生成针对目标web服务器的HTTP请求报文,TCP协议则为了方便通信,将HTTP请求报文分割成报文段,把每个报文可靠地传给对方。IP协议则搜索对方的地址,一边中转一边传送

服务器端,TCP协议负责从对方那里接收到报文段,重组到达的报文段,HTTP则负责对WEB服务器请求的内容进行处理。然后结果同样利用TCP/IP向用户回传。

我们仔细看一下上面的流程,去掉TCP,IP ,DNS在里面做的工作,首先客户端发起请求,向服务器请求一个页面的内容,通常是在浏览器里面输入一个网址(URL)这个网址叫URL(统一资源定位符),他只是表示资源所在的地点,在网络中更常见的是URI(统一资源标识符),他是URL的超集,在后面我们讨论的资源路径都是用URI表示的,我们可以看一个绝对URI的例子。

http://user:pass@www.example.cn:80/dir/index.htm?uid=1#ch1
http:协议方案名
user:pass 登录信息 (登录服务器的身份认证,可省略)
www.example.cn 服务器地址(可以是DNS可解析的名称,也可以时IP)
80 服务器端口号 (可选,不填则默认是80)
dir/index.htm 带层次的文件路径 (指定服务器上的文件路径来定位特指的资源)
uid=1 查询字符串 (针对已制定的文件路径内的资源,使用查询字符串传入任意参数)
#ch1 片段标识符 (无明确用法,不予讨论 ,可忽略)

那么在浏览器或者其他工具中输入URI后是怎么应用的呢?答案是HTTP请求报文(后面会讲),HTTP根据输入的URI和其他参数生成HTTP请求报文发送给服务器,忽略中间传输过程,HTTP服务器得到请求报文后,会对其进行解析,然后根据请求内容查询服务器的资源,再以响应报文的形式传回给客户端。客户端解析响应报文的内容,根据报文的内容进行下一步的任务。

请求报文与响应报文的格式

用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP报文叫做请求报文,响应段(服务器端)的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。用(CR+LF做换行符,CR回车符,16进制0x0d,LF换行符,16进制0x0a)

下图就是请求报文的格式



上图可以看到请求报文是由报文首部,空行,报文实体构成的。报文首部在通信中至关重要,因为重要作用的信息几乎都在这边。报文主体是所需要的用户和资源信息在这边。

下面我们重点说一下首部字段。使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容。HTTP首部字段是由首部字段名和字段值构成的,中间用冒号":"分割。在请求报文中首部字段根据实际用处被分为以下3种格式

  1. 通用首部字段
  2. 请求首部字段
  3. 实体首部字段

其中实体首部字段是针对报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。

下面的表格显示了常用首部字段的类型有哪些

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Date 创建报文的日期时间
Connection 逐跳首部、连接的管理
Transfer-Encoding 指定报文主体的传输编码方式

请求首部字段

首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Host 请求资源所在服务器
User-Agent HTTP 客户端程序的信息

实体首部字段

首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Type 实体主体的媒体类型
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI

关于每个字段的含义可以参考一下《图解http协议》这本书。

下面我们看一下响应报文的格式



由上图可以看出来,响应报文格式和请求报文大同小异,都是有保温首部,空行,报文实体组成。不同的是,组成报文首段的是通用首部,响应首部和实体首部组成。状态行的不同和响应首部的增加是响应报文有别于请求报文的地方,我们重点看一下状态行。

状态行中需要HTTP的版本,状态码和短语

下面的表格显示了状态码和短语

状态码 类别 原因短语
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错

状态码种类繁多,我们介绍实际上常用的几种

200 OK 表示从客户端发来的请求在服务器端被正常处理了。

204 No Content 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。

206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

301 Moved Permanently 永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI

302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。

303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。

304 Not Modified 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。

400 Bad Request 该状态码表示请求报文中存在语法错误

401 Unauthorized 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用 户认证失败。

403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。

404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。

503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

接下来,我们看一下响应首部字段的几个字段的含义。

首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Retry-After 对再次发起请求的时机要求
ETag 资源的匹配信息

上面就是我们对请求报文和响应报文的简单介绍

GET和POST

这篇文章主要是Android网络请求的先导文章,所以这里我们主要介绍Android网络请求的时候2个主要的方法,GETPOST

网上有很多说法关于GET和POST的区别,大家可以看看这篇文章GET和POST真正的区别,这个不是我们这篇文章要讨论的内容,我们只需要记住一点,GET是从服务器获取数据,POST是改变服务器数据就可以了。

GET方法用于获取由URI所标示的资源信息,他是将请求参数直接放到URL后面,第一个参数前有一个"?",参数格式为 参数名=参数值,参数之间通过"&"链接

POST用于修改服务器的数据,所以他的参数一般存储在报文的报文主体。

Http基础的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  10. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

随机推荐

  1. 【Mail】邮件的基础知识和原理

    电子邮件概念 电子邮件是-种用电子手段提供信息交换的通信方式,是互联网应用最广的服务.通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费).非常快速的方式(几秒钟之内可以 ...

  2. SpringMVC 的RequestMapping

    Spring MVC之@RequestMapping 详解 2013-10-13 23:39 150698人阅读 评论(6) 收藏 举报  分类: Java 精华文章(161)    目录(?)[+] ...

  3. navicat自动备份数据

    1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业". 2.双击上面的可用任务,它就会到下面的列表 ...

  4. 理解Java Integer的缓存策略

    转载自http://www.importnew.com/18884.html 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性. ...

  5. Ubuntu下命令行方式对PDF文件进行缩放、合并、拆分

    安装软件: sudo aptitude install ghostscript 然后执行命令: gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibili ...

  6. __attribute__((packed))详解

      1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关 ...

  7. Win7 64下Visual C++ 6.0不兼容

    Win7 64下Visual C++ 6.0不兼容 安装VSE6.0: 1.运行setup.exe安装程序,会弹出如下的的 程序兼容性助手 提示框,这个是Win7在警告用户vc6存在兼容性问题:此程序 ...

  8. Web测试基础点

    摘自:软件工程师成长之路 1.获取当前使用的Flash播放器版本(Flash Player Version)信息 在浏览器地址栏输入http://www.playerversion.com/,即可显示

  9. Android ImageView高度根据图片比例自适应

    设置adjustViewBounds // 是否保持宽高比 <ImageView android:id="@+id/iv_test" android:layout_width ...

  10. Mac OS 系统工具使用

    1. 截屏的处理 Command + Shift + 4