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 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

【web必知必会】——图解HTTP(上)

  本篇总结关于http的相关知识,主要内容参考如下导图: ?   主要讲解的内容有:   1 URL与URI的区别。   2 请求报文与相应报文的内容。   ...

1929
来自专栏网络

web调试工具——Fiddler使用介绍(二)

一、Fiddler断点设置 设置断点是Fiddler最强大的功能之一,在设置好断点后,Fiddler会捕捉所有经过的消息,我们可以任意修改HTTP请求信息,包括...

1749
来自专栏WindCoder

通过Js判断客户端为PC端还是手持设备

Js中获取浏览器信息字符串只要使用navigator.userAgent即可,这样我们再利用indexof来判断版本或其它信息了。

652
来自专栏java 成神之路

URI、 URL 和 URN 的区别

33615
来自专栏程序猿DD

从零开始的Spring Session(一)

新媒体管家 Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了。最近在研究跨域单点登录的实现时,发现对于Sessio...

1938
来自专栏同步博客

Session攻击(会话劫持+固定)与防御

  Session对于Web应用无疑是最重要的,也是最复杂的。对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验...

642
来自专栏开源优测

接口测试 | 27 HTTP接口详细验证清单

概述 当我们在构建、测试、发布一套新的HTTP API时,包括我在内的大多数人都不知道他们所构建的每一个组件的复杂性和细微差别。 即使你对每一个组件都有深刻的理...

3276
来自专栏前端知识分享

第207天:HTTP协议头字段详解大全

HTTP Header非常之多,很少有人能完全分清这些Header到底是干什么的。鉴于RFC文件规范艰深晦涩难懂,本文对协议规范中列出的HTTP Header进...

993
来自专栏技术小黑屋

Android中HTTP相关的API

Android中大多数应用都会发送和接受HTTP请求,在Android API中主要由两个HTTP请求的相关类,一个是HttpURLConnection,另一个...

733
来自专栏圣杰的专栏

Asp.net web api 知多少

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

2015

扫码关注云+社区