HTTP协议基础:请求与响应、常见方法、状态码
说实话,很多初学者一上来就撸代码,结果连HTTP请求都发不明白。我见过太多人把GET请求的参数塞到请求体里,然后跑来问我为什么服务器不认。嗯,今天我们就从根上把HTTP协议捋清楚。
一、HTTP请求长什么样?
一个HTTP请求,说白了就是一段有格式的文本。你想想看,浏览器和服务器之间通信,总得有个规矩吧?这个规矩就是HTTP协议。
一个典型的GET请求是这样的:
GET /api/users?id=123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
我个人习惯把请求拆成三部分来看:
- 请求行:第一行,包含方法、路径、协议版本
- 请求头:从第二行开始到空行结束,携带元数据
- 请求体:空行之后的内容,POST请求常用
重点记住:请求头和请求体之间必须有一个空行。我曾经调试一个接口调了半天,最后发现是忘了加这个空行,服务器一直收不到body数据。
二、HTTP响应又是什么?
服务器收到请求后,会返回一个响应。格式和请求类似,但第一行变成了状态行。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
{"status":"success","data":[]}
响应也分三部分:
- 状态行:协议版本 + 状态码 + 状态描述
- 响应头:告诉客户端怎么处理返回的数据
- 响应体:实际返回的数据内容
小技巧:在鸿蒙开发中,用HttpClient调试时,记得先打印响应头。我经常通过Content-Type来判断返回的是JSON还是HTML,避免解析出错。
三、常见的HTTP方法
实际开发中,最常用的就两个:GET和POST。但作为专业开发者,其他几个也得了解。
| 方法 | 用途 | 是否携带请求体 | 幂等性 |
|---|---|---|---|
| GET | 获取资源 | 否 | 是 |
| POST | 创建资源 | 是 | 否 |
| PUT | 更新资源(全量) | 是 | 是 |
| DELETE | 删除资源 | 通常否 | 是 |
| PATCH | 更新资源(部分) | 是 | 否 |
避坑指南:我曾经在项目中用GET请求传了一个很长的JSON参数,结果浏览器直接报414错误。因为GET请求的URL长度是有限制的,一般不超过2048个字符。数据量大时,请用POST。
四、HTTP状态码
状态码是服务器给客户端的「暗号」。我刚开始学的时候记不住,后来发现其实有规律可循。
1xx:信息提示
用得很少,表示请求已接收,继续处理。比如101表示切换协议(WebSocket升级时用)。
2xx:成功
- 200 OK:请求成功,最常用的状态码
- 201 Created:资源创建成功,POST请求后常见
- 204 No Content:成功但无返回内容,DELETE请求常用
3xx:重定向
- 301 Moved Permanently:资源永久迁移
- 302 Found:临时重定向
- 304 Not Modified:缓存有效,直接用本地缓存
个人经验:304状态码经常被忽略。我在优化App性能时,通过合理设置缓存头,让客户端返回304时直接使用本地数据,网络请求量减少了40%。
4xx:客户端错误
- 400 Bad Request:请求格式错误,参数不对
- 401 Unauthorized:未认证,需要登录
- 403 Forbidden:已认证但无权限
- 404 Not Found:资源不存在
- 405 Method Not Allowed:请求方法不支持
- 429 Too Many Requests:请求频率过高
5xx:服务器错误
- 500 Internal Server Error:服务器内部错误,最头疼的
- 502 Bad Gateway:网关错误,上游服务挂了
- 503 Service Unavailable:服务暂时不可用,过载或维护
- 504 Gateway Timeout:网关超时,上游响应太慢
调试建议:在鸿蒙开发中,遇到500错误先别慌。我一般先看响应体里有没有错误详情,如果没有,再去看服务器日志。很多时候是参数类型不匹配导致的。
五、知识体系总览
下面这张图是我自己整理的HTTP协议核心脉络,你看完应该能串起来了:
这张图把HTTP的核心流程和结构都画出来了。你想想看,客户端发请求,服务器回响应,中间就是方法和状态码在起作用。说白了,搞懂这张图,HTTP协议你就入门了。
总结一下:HTTP协议没那么神秘,它就是客户端和服务器之间约定好的沟通格式。记住请求的三部分、响应的三部分、常用的几个方法和状态码,你就能应付90%的开发场景了。
公众号:蓝海资料掘金营,微信deep3321