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及其元素的概述。希望本教程为您提供了一个开始和一些资源,以便在必要时进一步阅读更多详细信息。
网友评论