透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

12 | 响应状态码该怎么用?

课下作业
常见状态码的含义和应用
使用状态码的重要性
状态码分类
状态行结构
响应报文结构
HTTP响应状态码

该思维导图由 AI 生成,仅供参考

前两讲中,我们学习了 HTTP 报文里请求行的组成部分,包括请求方法和 URI。有了请求行,加上后面的头字段就形成了请求头,可以通过 TCP/IP 协议发送给服务器。
服务器收到请求报文,解析后需要进行处理,具体的业务逻辑多种多样,但最后必定是拼出一个响应报文发回客户端。
响应报文由响应头加响应体数据组成,响应头又由状态行和头字段构成。
我们先来复习一下状态行的结构,有三部分:
开头的 Version 部分是 HTTP 协议的版本号,通常是 HTTP/1.1,用处不是很大。
后面的 Reason 部分是原因短语,是状态码的简短文字描述,例如“OK”“Not Found”等等,也可以自定义。但它只是为了兼容早期的文本客户端而存在,提供的信息很有限,目前的大多数客户端都会忽略它。
所以,状态行里有用的就只剩下中间的状态码(Status Code)了。它是一个十进制数字,以代码的形式表示服务器对请求的处理结果,就像我们通常编写程序时函数返回的错误码一样。
不过你要注意,它的名字是“状态码”而不是“错误码”。也就是说,它的含义不仅是错误,更重要的意义在于表达 HTTP 数据处理的“状态”,客户端可以依据代码适时转换处理状态,例如继续发送请求、切换协议,重定向跳转等,有那么点 TCP 状态转换的意思。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP响应状态码是服务器对请求处理结果的表示,它不仅仅是错误码,更重要的是表达了HTTP数据处理的“状态”。文章介绍了状态码的结构、分类和具体含义。状态码分为五类,分别表示提示信息、成功、重定向、客户端错误和服务器错误。客户端和服务器都有责任正确理解和应用这些状态码。客户端需要根据状态码判断请求是否被正确处理,是否需要重新发送请求,服务器则需要选择恰当的状态码回复客户端,指示客户端下一步应该如何行动。文章还介绍了一些常见的状态码,如“101 Switching Protocols”表示协议切换,“200 OK”表示成功处理请求,“301 Moved Permanently”表示永久重定向,“400 Bad Request”表示请求报文有误等。此外,还介绍了一些开发中常用的状态码,如“405 Method Not Allowed”和“429 Too Many Requests”。总的来说,状态码的正确理解和应用对于客户端和服务器都至关重要。文章内容涵盖了状态码的基本概念、分类和常见状态码的含义,对于读者快速了解HTTP响应状态码具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(53)

  • 最新
  • 精选
  • 肥low
    1、4xx一般是服务端业务状态码,看业务上怎么解决的,5xx就比较多了,500、502比如是在lnmp架构下,500是php代码写的很烂,导致nginx的upstream接受错误,抛异常了。502就是php-fpm挂了。504说明有慢查询php-fpm可能还在运行着,可是ngx由于本身的超时设置已经主动断开了,entity too large就是上传发文件超过ngx本身设置,其它的好像还没遇到过,404大多是浏览器请求facon.ico导致的,现在前后端分离根本没这个东西 2、参数错误一般是通过接口返回具体的业务代码来表明,http响应报文一般都是200,也有400的,但是我的经验中一般是返回的body为json格式,然后里面通过一个errno来标识一下,具体怎么规定我觉得在接口文档中写清楚就好

    作者回复: 写的很好。

    2019-06-25
    8
    39
  • ly
    个人对状态码使用的理解: 就目前项目开发的过程中,状态码的使用对业务程序来说,基本上很少去利用,大致都是nginx、tomcat、spring等这些框架、中间件会返回一些状态码,例如接口不存在,框架会返回404,nginx配置有问题或者拒绝访问返回403或者502等状态码,一旦正确进入业务接口的时候,不管请求的用户id是否在用户库中存在、以及请求参数中是否缺少必要参数,都是返回200状态码,只是在body的json里面会返回自己特有的业务错误码,例如: {"code":-1,"message:"userid参数必须填写"}。 整体来讲,开发业务的程序员很少会去思考该返回什么http状态码,不知道这样的开发过程是否标准?

    作者回复: 这也是web服务里的一种常见做法。 因为http状态码很有限,而且含义不是很清楚,所以通常需要在body里返回额外的数据来说明更详细的错误原因,常用的就是json了。

    2019-08-11
    3
    22
  • 壹笙☞漂泊
    课后题: 1、给个错误页面、或者弹窗报个错误,然后做跳转 2、在返回body里面写明错误原因,状态码一般给500 总结: 1、状态行结构: version【SP】status code【SP】reason【CRLF】 version:是HTTP协议的版本号,用处不大 reason:是原因短语,简短的文字描述,如果“OK”“Not Found”等等,也可以自定义,用处也不大,很多客户端会忽略,为了兼容早期的文本客户端 status code:状态码,不是错误码,表达状态。以代码的形式表示服务器对请求的处理结果。 2、状态码 RFC标准规定状态码是三位数,把状态码分成了五类,用数字的第一位表示分类。 * 1xx:提示信息,表示目前是协议处理的中间状态,还需要后续的操作; * 2xx: 成功,报文已经收到并被正确处理; * 3xx:重定向,资源位置发生变动,需要客户端重新发送请求; * 4xx:客户端错误,请求报文有误,服务器无法处理; * 5xx:服务器错误,服务器在处理请求时内部发生了错误。

    作者回复: 总结的不错。

    2019-06-25
    4
    7
  • 第一个问题: 目前客户端基本都是解析成失败的情况,大部分给个失败错误友好界面 第二个问题: 目前服务器很多也是返回4xx的错误妈,感觉被烂用了,应该要返回5xx,然后我们还会定义一个msg字段,用来说明具体失败的原因

    作者回复: √

    2019-06-24
    2
    6
  • 马哲富
    希望老师在后续的过程中讲一下206这个断点续传,是不是类似于百度网盘那种下载软件暂停后再继续下载也是类似的原理?

    作者回复: 后面会专门讲的。

    2019-06-24
    3
  • 彧豪
    1.一般接口报错的话返回的body中都会封装有错误消息,显示消息即可,401一般都不作处理,比如获取登录用户的信息的接口,未登录的时候调是401,是因为没有带相应token过去,登录之后就能正常返回登录用户的信息了,自己处理的情况比如SPA,用户访问了一个不存在的路由,此时前端自己返回一个404的页面,里面是一张图片:“么么哒,网页找不到了耶”之类的🤣🤣,5xx这个时候需要找服务端沟通了,正式上线一般不会出现5xx的错误,一般在开发时出现 2.返回的body中告知前端错误信息 另外就是老师貌似忘了讲401了,401也挺常见/用的,默认原因短语是"Unauthorized",比如调登录接口没带授权的时候

    作者回复: 401在rfc7235中,我用的比较少,所以就不说了。 感谢你的补充。

    2019-06-24
    3
  • ifelse
    作业 1.跳自定义错误页面 2.返回json,用code字段表示具体业务错误代码比如:100001,msg字段表示错误原因比如:缺少id,状态响应码还是200

    作者回复: good

    2023-01-23归属地:浙江
    1
  • Ivan@_@
    看了评论后,有点困惑……对于第二个问题,我觉得是很明显的客户端错误,应该很自然的用400 bad request 然后用body 拓展详细的错误。 为什么好像200 ok很流行呢?是历史遗留问题么? 很多框架包装了一个方法,类似于,issucesscode, ensuresucesscode ……,如果有这样不符合约定的状态码用法,你自己用,当然怎么都可以,要是开放给别的用户,应该会有很多问题吧。 比如,别人有一套框架,5xx直接显示一个通用错误消息,400才从body读具体消息,结果,你把validation error 放到5xx,那你的客户还得专门为你写一套处理方法。

    作者回复: 说的很对。 因为http协议太灵活了,所以就会有各种各样的用法,有的虽然不是太规范,但用的人多了也就成了约定俗成。 不过这一点也并不需要太在意,本来http对此也没有强制的要求,只要大家都用一种能理解的形式就可以了。

    2022-04-07
    1
  • Leolee
    作业: 1、统一跳转到一个报错页面 2、自定义一个4XX代码,告知客户端缺少了一个query。 状态码 目前的RFC标准里规定状态码是三位数,取值范围从100~599,用数字第一位表示分类,共五类,这五类具体含义是: · 1XX :提示信息,表示目前是协议处理的中间状态,還需要后续的操作; · 2XX :成功,报文已经收到并被正确处理; · 3XX :重定向,资源位置发生变动,需要客户端重新发送请求; · 4XX :客户端错误,请求报文有误,服务器无法处理; · 5XX :服务器错误,服务器在处理请求时内部发生了错误。 1xx 此类属于提示信息,是协议处理的中间状态,实际能够用到的时候很少。 101 Swiching Protocols 意思是客户端使用Upgrade头字段,要求在HTTP协议基础上改成其他协议继续通信,比如WebSocket,如果服务器统一变更协议,就会返回101,后续数据传输就不会再使用HTTP了。 2xx 此类表示服务器收到并成功处理了客户端的请求,客户端最喜欢的状态码。 200 ok 浏览器最喜欢的成功了; 202 Accepted 浏览器收到请求,但暂缓处理,暂时无法给出处理结果; 204 No Content 含义与200 OK基本相同,但响应头后没有body数据; 206 Particl Content 意思是服务器成功处理了请求,但body里的数据不是资源的全部,而是一部分,这个是HTTP分块下载或断点续传的基础,在客户端放松了“范围请求”、要求获取资源的部分数据时出现。一般206后会跟着头字段“Content-Range”,表示body里数据的具体范围,例如“Content-Range:bytes 0-99/2000”。 3xx 此类表示客户端请求的资源发生了改动,客户端必须用新的URI创新发送请求获取资源,也就是通常所说的”重定向“,包括注明的301、302跳转。 301 Moved Permanently 俗称“永久重定向”,含义是此次请求的资源已经不存在了,需要该用新的URI再次访问。 302 Found 俗称“临时重定向”,意思是请求的资源还在,但需要暂时用了一个URI来访问。 304 Not Modified 即“缓存重定向”,用于If-Modified-Since等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义。 4xx 此类表示客户端发送的请求报文有无,服务器无法处理,含义就是“错误码”。 400 Bad Request 含义就是数据格式有误,具体哪里错误没有明说,会让客户端一头雾水,开发WEB应用时应该尽量避免; 403 Forbidden 这个不是客户的的请求出错,而是服务器禁止访问资源。愿意多种多样,可能是信息敏感、法律禁止等; 404 Not Found 被滥用的状态码,愿意是请求的资源在服务器上找不到,但很多服务器动不动就给你来个404; 405 Method Not Allowed 不允许使用某些方法操作资源,例如不允许POST只允许GET; 406 Not Acceptable 资源无法满足客户端请求的条件,例如请求中文但只有英文; 408 Request Timeout 请求超时,服务器等待了过长的时间; 409 Conflict 多个请求发生了冲突,可以理解为多线程并发时的竞争状态; 413 Request Enitity Too Large 请求报文里的body太大; 414 Request-URI Too Long 请求行里的URI太长; 429 Too Many Requests 客户端发送了太多请求,通常是由于服务器的限制连接策略; 431 Request Header Fields Too Large 请求头某个字段或总体太大。 5xx 此类表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”。 500 Internal Server Error 相当于服务器端的400,属于通用错误码,不利于调试,但能够防止黑客窥探或分析; 501 Not Implemented 表示客户端请求的功能还不支持; 502 Bad Gateway 通常是服务器作为王冠或者代理是返回的错误码,表示服务器自身工作正常,访问后端服务器时发生错误,具体错误原因未知; 503 Service Unavailable 服务器繁忙,当前不可用,这是一个临时的状态,通常503的响应报文里会有一个“Retry-After”字段,意思是多久后再重试。

    作者回复: 学习态度非常认真,课下问题可以再参考其他同学的回答。

    2021-04-20
    2
    1
  • Geek_Maggie
    【课后思考题】 1. 你在开发 HTTP 客户端,收到了一个非标准的状态码,比如 4××、5××,应当如何应对呢? 我个人感觉4XX和5XX还是要区分开提示。4XX主要是客户端错误,5XX主要是服务端处理错误。如果是我开发客户端遇到这个问题,我会和业务人员沟通要如何进行客户提示,如:4XX一律提示为“请求有误,请稍后再试” 5XX一律提示为“服务器繁忙,请稍后重试”; 2. 你在开发 HTTP 服务器,处理请求时发现报文里缺了一个必需的 query 参数,应该如何告知客户端错误原因呢? 返回4xx错误,并在返回json报文中定义详细错误代号,如:{code: "-1"; msg:QUERY_ERROR; ......}

    作者回复: 说的挺好,4xx和5xx目前的错误还是比较少,不能准确描述所有的错误,所以最好再添加其他的信息,方便排错。

    2021-03-15
    1
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部