HTTP面试-常用状态码(status code)的那些事

1,036 阅读7分钟

状态码分类

1XX //信息提示
2XX //成功
3XX //重定向
4XX //客户端错误
5XX //服务端错误

常用状态码

  • 200OK
  • 301Moved Permanently
  • 400Bad Request
  • 404Not Found
  • 409Conflict
  • 410Gone
  • 500Internal Server Error

1XX系列-通知

仅在与HTTP服务器沟通时使用。

  • 100 Continue

    常用指数:★★

    继续,对一个LBYL(look-before-you-leap)请求的一个可能的响应。代表客户端应重新发送初始请求,并在请求中附上第一次请求时未提供的(可能很大或者包含敏感信息的)表示。状态码\color{#FF3030}{100}

    使用的场景:客户端需要发送一个比较大的文件,不确定服务端是否接受,客户端发送一个请求,包含请求头Expect: 100-continue,服务端觉得可以接受,返回\color{#FF3030}{100} continue,客户端继续发送大文件。如果不接受,就返回\color{#FF3030}{417} Expectation Failed

2XX系列-成功

表明操作成功。

  • 200 success

    常用指数:★★★★★

    成功,代表服务端已经收到并成功处理了请求,通常来说,携带了请求的数据||文件||响应头。

  • 201 Created

    常用指数:★★★★

    创建新资源,代表服务端根据请求创建了新的资源,通常是通过PUT方法调用后返回的状态。通过会在响应头的\color{#FF3030}{Content-Location}字段加上新创建资源的urlContent-Location: /new.html

  • 204 No Content

    常用指数:★★★★

    没有内容,代表服务端返回的响应无内容只是成功处理了请求,但没有返回任何内容。使用场景在:可能会出现仅需要响应的请求头,但没有内容的情况。

  • 206 Partial Content

    部分GET(partial GET)的服务常用指数:★★★★,其他请求:★

    部分内容,表示服务端返回的数据是部分数据,使用场景:当客户端通过使用range头字段进行文件分段下载时返回\color{#FF3030}{206} Partial Content。

3XX系列-重定向

表明客户端需要做些额外工作才能得到所需要的资源。通常用于GET请求。他们通常告诉客户端需要向另一个URI发送GET请求,才能得到所需的表示。那个URI就包含在Location响应报头里。

  • 301Moved Permanently

    常用指数:★★★★★ 永久转移,当客户端触发的动作引起了资源URI的变化时发送此响应代码。另外,当客户端向一个资源的旧URI发送请求时,也发送此响应代码。

  • 303See Other

    常用指数:★★★

    您可以去其他地方瞧瞧,可能会有更适合的资源。就是资源不在当前URL,指定另一个url。

  • 304Not Modified

    常用指数:★★★★

    不能修改,和\color{#FF3030}{204}类似:响应实体主体都必须为空。但204用于没有主体数据的情况,而304用于有主体数据,但客户端已拥有该数据,没必要重复发送的情况。

    使用场景:客户端在发送GET请求时附上了一个值为Sunday的If-Modified-Since报头,而客户端所请求的表示在服务器端自Sunday以来一直没有改变过,服务器可以返回一个\color{#FF3030}{200}响应,但由于客户端已拥有该表示,因此重复发送该表示只会白白浪费宽带。所以可以使用\color{#FF3030}{304}状态码。

    响应报头:需要提供Date报头。Etag与Content-Location报头的值,应该跟返回\color{#FF3030}{200}响应时的一样。若Expires, Cache-Control及Vary报头的值自上次发送以来已经改变,那么就要提供这些报头。

4XX系列-客户端错误

表明客户端出现错误。不是认证信息有问题,就是表示格式或HTTP库本身有问题。客户端需要自行改正。

  • 400 Bad Request

    常用指数:★★★★ 错误请求,通用的客户端错误状态,就是当其他4xx状态码不适用时,使用的备胎错误码。通常也表示服务器收到客户端通过PUT或者POST请求提交的表示,表示的格式正确,但服务器不懂它什么意思的情况。

  • 401Unauthorized

    常用指数:★★★

    未授权,代表请求服务没有授权,客户端发送请求,查看收到\color{#FF3030}{401} 响应,用来知晓需要发送何种认证授权以及证书的格式。通常如果服务器不想让未授权的用户访问某个资源,直接返回\color{#FF3030}{404} 而不是\color{#FF3030}{401} 。但是这样做有缺点:客户端需要事先知道服务器接受哪种认证--这将导致HTTP摘要认证无法工作。

  • 403Forbidden

    常用指数:★★

    禁止,表示服务器收到了请求但是不想做出响应。和\color{#FF3030}{401}不同,一般\color{#FF3030}{403}常用于一个资源只允许在特定时间段或者特定IP地址的用户访问的情况。\color{#FF3030}{403}暗示了所请求的资源确实存在。和\color{#FF3030}{401}一样,如果不想让用户知道资源确实存在,可以直接返回\color{#FF3030}{404} 而不是\color{#FF3030}{401} 。缺点同上。

  • 404Not Found

    常用指数:★★★★★

    没有被找到,表示请求的资源不存在。

  • 405Method Not Allowd

    常用指数:★★★

    方法不被允许,客户端试图使用不支持的HTTP方法。通常一个请求只支持GET方法,但是客户端使用PUT方法访问。返回\color{#FF3030}{405}

    而在响应头:Allow字段列出本资源支持哪些HTTP方法,Allow:GET,POST

  • 409Conflict

    常用指数:★★★

    请求冲突。请求会导致服务器的资源处于冲突状态。例如试图修改某个字段,但于已存在的数据冲突了。

  • 410("Gone") 常用指数:★★★

    已请求过,\color{#FF3030}{404}类似,但它提供的有用信息更多一些。服务器接受到请求,但该资源现在不存在了的情况。服务器不知道该资源的新URI,服务器要是知道该URI的话,它就发送响应代码301一样,都有暗示客户端不应该再请求该URI的意思,不同之处在于:410只是指出该资源不存在,但没有给出该资源的新URI。

  • 417Expectation Failed

    常用指数:★★

    期望失败。与\color{#FF3030}{100} 相反,表示拒绝LBYL请求。

    这个响应代码跟404类似,但它提供的有用信息更多一些。这个响应代码用于服务器知道被请求的URI过去曾指向一个资源,但该资源现在不存在了的情况。服务器不知道 该资源的新URI,服务器要是知道该URI的话,它就发送响应代码301.410和310一样,都有暗示客户端不应该再请求该URI的意思,不同之处在于:410只是指出该资源不存在,但没有给出该资源的新URI。RFC2616建议“为短期的推广服务,以及属于个人但不继续在服务端运行的资源”采用410.

##5XX系列-服务端错误

表明服务器端出现错误。一般来说,这些代码意味着服务器处于不能执行客户端请求的状态,此时客户端应稍后重试。有时,服务器能够估计客户端应在多久之后重试。并把该信息放在Retry-After响应报头里。

  • 500Internal Server Error

    常用指数:★★★★★

    服务期方面的问题。实体主体中的文档(如果存在的话)是一个错误消息。该错误消息通常无济于事,因为客户端无法修复服务器方面的问题。

  • 502Bad Gateway 常用指数:★★

    网关损坏,服务器作为网关且从上游服务器获取到了一个无效的HTTP响应.可能客户端使用了错误的代理,或者上游服务器访问过多挂了。

碎碎念

越写越发现,好多中小公司因为水平参差不齐,工程中很少是完全按照HTTP设计的,将各种情况分为不同状态码,甚至大厂都是混乱的(特指微信小程序),基本上都是网络正常返回200,网络错误返回500,再在200里包含一个status字段来定义各种情况。