HTTP 基本知识

1、HTTP 基础

当您开发服务器或客户端应用程序时,您很有可能通过HTTP执行API请求。HTTP(超文本传输协议)是用于万维网(WWW)的应用级通信的标准化协议。 HTTP基于请求和响应。对于本教程,Android应用程序将作为客户端,并向服务器发送请求,该服务器将发回响应。要在服务器上请求的资源的标识符始终使用URL(统一资源定位符)。URL的方案表示您是加密(例如,https)通信(例如,http)。

2、客户端请求

Android应用程序向服务器发送请求。请求包含四个主要部分: a、Request line(请求的URL地址) b、Request headers(请求头(可选)) c、Empty line to separate headers and body(空的URL去分离header和body) d、Request body(请求体(可选)) 下面,我们将详细介绍这几部分。

① Request line 请求的第一部分是request line。它包含两条信息:请求方法和请求URL。我们将在下面研究请求方法。现在我们以GET为例,这意味着客户端不发送数据,只是询问服务器的一些信息。服务器根据传递的请求URL知道客户端要求的资源。 例如:

GET https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505107071654&di=f874b2d2bf8d1d78bbfc5ae0d9aeb488&imgtype=0&src=http%3A%2F%2Fpic7.nipic.com%2F20100514%2F2158700_153225558098_2.jpg

上面的代码是一个有效的请求,要求服务器返回一张图片。

② Request Headers 有时,服务器需要更多的信息,而不仅仅是请求方法和资源位置。例如,很多服务器实现支持各种客户端。以前,我们开展过一个项目,服务器根据客户端是Android或IOS应用程序,发送不同的回复。但服务器如何知道是什么样的应用程序请求资源?请求头!没错,就是请求头!请求头是用于附加数据补充请求的一种方式,它们被构造为简单的基于文本的键值数组。在上面的示例中,Android应用程序将添加一个用户代理:Android 头,从而将自己标识给服务器。还有更多的标准header,甚至更多的自定义header,您可以根据您的应用程序进行开发。重要的是要知道header在创建一个干净的应用程序和减少在请求URL或请求正文中发送的数据量非常有用。

③ Request Body 与header不同,请求体支持各种格式的复杂数据结构。通用数据格式是JSON,XML或二进制格式。请求体通常包含消息的重要部分。例如,如果客户端将向服务器发出创建新用户的请求,则请求主体将包含用户的信息(名称,地址,...)。

3、Request Methods(请求方式)

您已经知道了请求的第一部分是请求方法,如GET。这并不是偶然的,根据请求方式请求的性质可能完全不同。

GET https://baidu.com/api/user/42  
DELETE https:/baidu.com/api/user/42  

例如,上面的请求几乎是相同的。然后,第一个将请求用户42的数据,而第二个将删除它!因此,请仔细处理请求方法。

① GET 正如我们多次提到的,GET请求方法向服务器请求客户端要访问哪些数据。这是一个简单的阅读,它不会添加,更改或删除它。

② POST&PUT POST和PUT都是将数据发送到服务器的方式。但是,其含义是不同的。POST请求期望服务器将其添加到现有的。例如,具有用户对象的POST请求意味着服务器创建一个新账户。另一方面,PUT请求期望服务器更新或替换现有的数据项。因此,如果有人更新自己的配置文件,则具有用户对象的PUT请求将是适合的。

③ DELETE 最后,也是最简单的一个DELETE。如果要删除您在请求URL中指定的数据项,则使用DELETE。总体而言,您可能会认识到GET,POST,PUT,DELETE与许多数据库的CRUD模型非常相似。GET等于读取,POST正在创建一新的数据项,PUT正在编辑,DELETE是删除。

4、HEAD, PATCH, TRACE, OPTIONS, CONNECT

在绝大多数API中,您可以编辑或交互,这四个请求方法将足够。然而,在有些罕见的情况下,另一种请求方法可能更适合。由于它们超出了本教程的介绍性质,建议大家稍后阅读特殊请求方法。最后,希望大家遵循请求方式标准。在大多数情况下,客户端,服务器和开发人员都更容易遵循通用的请求方法。

5、Server Responses(服务器响应)

在上一节中,我们仅查看了客户端-服务器交互的前半部分。当然,服务器的响应也很重要。响应的结构也与请求略有不同。它通常包含四个部分: a、Status line(包括状态码和文本描述) b、Response headers (响应头(可选)) c、Empty line to separate headers and body(空的URL去分离header和body) d、Response body(响应体(可选))

虽然响应头和响应体的结构与请求的对应关系相同,但是第一行实现的是完全不同的功能。状态码通知客户请求的结果。换句话说,它告诉你你的请求是否成功。当然,取决于内容,有一百万中不同的结果。因此状态行分为两部分:状态码和文本描述。文本不遵守任何标准化,可以是描述成功或错误的任何字符串。然而,状态码会以预期的方式行事。接下来我们再详细了解它们。

① Status Codes(状态代码) 如上面所了解的,状态码和文本描述由服务器设置,并作为服务器响应的第一行发送。客户端将使用这一行来快速了解服务器发送什么样的响应。我们来看一些状态码的示例:

200 OK  
204 No Content  
401 Unauthorized  
503 Service Unavailable

第一部分,数字状态码包含3个数字。这些数字被分成几百个,我们将在下面了解它们。 a、1xx Informational 虽然存在1xx的状态码,但它们通常用于更低级别的东西,而且您很可能在现实中不用去处理它们。

b、2xx Success 希望您最多使用这些状态码。以2开头的所有状态码表示请求成功。 几个重要的2xx状态码:

  • 200 OK - 用于指示成功请求的标准响应。可惜的是,许多API专门使用这个API,不会将成功分解成其他2xx状态码。
  • 201创建 - 请求成功导致创建新的东西。
  • 204无内容 - 请求成功,但服务器没有响应任何数据。这通常用于确认资源的成功删除。

c、3xx Redirect(重定向) 3xx组中的状态码都表示指定的URL不是正在或永久地服务于服务器,会在其他地方指示您的请求。这主要用于Web服务器,那些传递网页和较少的API。

d、4xx Client Error 希望您没有经常要去处理4xx组中的状态码。他们表示请求的形式不正确,服务器无法处理。会有一些技术原因,为什么会发生这种情况,例如,请求对服务器来说太大。但是,通常,请求的参数是有问题的。 几个常见的4xx状态码:

  • 400错误请求 - 与2xx状态码类似,这是所有类型的错误的统称。一些API专门使用它,这使得客户端很难理解错误。理想情况下,如果服务器的请求以某种不正确的形式(丢失数据,数据违反输入约束,...),则服务器只400状态码,并在响应主体中更详细地指定错误。
  • 401未经授权 - 此状态码对请求的内容没有任何说明,它告诉您无法处理请求,因为服务器无法验证请求(不知道请求后面的用户是谁)。通常,这意味着认证令牌丢失或不正确。
  • 403禁止 - 通常与401混淆,但是这里的服务器知道请求发件人是谁,但不允许该操作。例如,用户可以发送删除另一个用户的请求,但是需要管理员访问权限。
  • 404未找到 - 您在浏览网页时会时常看到这个。它也可以用于API。如果客户端尝试访问不存在的内容(应该会收到)。

e、5xx Server Error 最后的5xx组状态码特别麻烦。这些表示服务器有问题,无法处理您的请求。如果您是服务器开发人员,这些错误是您应该注意的。如果您是客户端开发人员。您也应该寻找他们,并立即向API人员报告。 最常用的5xx状态码是:

  • 500内部服务器错误 - 捕获所有因为各种原因,无法在服务器端处理请求。通常提示错误或错误配置。
  • 503服务不可用 - 这意味着服务器出现了问题。

总结

在这篇文章中,您已经看到了HTTP及其元素的概述。希望本教程为您提供了一个开始和一些资源,以便在必要时进一步阅读更多详细信息。

快乐工作,享受编程!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构

Java 程序员须知道和掌握的 Linux 命令

1823
来自专栏小樱的经验随笔

【批处理学习笔记】第十二课:常用DOS命令(2)

 文件管理 type 显示文本文件的内容。 copy 将一份或多份文件复制到另一个位置。 del 删除一个或数个文件。 move 移动文件并重命名文件和目录。(...

2854
来自专栏前端vue

Node中间件multer文件上传实践

单文件上传,接收一个以fieldname命名的文件,文件信息保存在req.file

982
来自专栏加米谷大数据

MongoDB 安装和可视化工具

MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,我选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在...

2281
来自专栏10km的专栏

PyDev:修改代码模板自动添加encoding=utf8,避免中文乱码

如果python代码中有中文则在代码最开始加上#coding=utf8,就可以解决了。 既然这样,在eclipse下可以修改python代码模板,就可以在每...

2095
来自专栏linux系统运维

rsync工具介绍, rsync常用选项,rsync通过ssh同步

2285
来自专栏L宝宝聊IT

Squid代理服务器

77311
来自专栏北京马哥教育

ansible常用模块简单介绍

本篇介绍下常用的模块。根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、...

960
来自专栏lgp20151222

SVN错误:SVN Working copy XXX is too old

这是因为使用了低版本的svn生成了.svn内文件内容,但是,使用高版本svn同步时便出现该问题。

1361
来自专栏企鹅号快讯

最实用的Linux命令总结

1.linux安装中文环境(可选) 联网之后执行:sudo yum groupinstall chinese-support,安装完语言包之后修改/etc/sy...

2668

扫码关注云+社区

领取腾讯云代金券