HTTP响应处理大全:Response对象设置Header与返回JSON数据详解
一、"为什么我的API接口总被浏览器拦截?"——Header设置生死局
(拍桌子)咱们做后端的兄弟最憋屈啥?明明接口能用,前端死活收不到数据!这时候就得掏出??Response Header??这把钥匙。
??三大救命场景:??
-
??跨域拦路虎??:前端域名和接口域名不一致时
- 加
Access-Control-Allow-Origin: *
- 补
Access-Control-Allow-Methods: GET,POST
- 加
-
??缓存捣蛋鬼??:用户总看到过期数据
Cache-Control: no-store
(禁止缓存)Expires: Thu, 01 Jan 1970 00:00:00 GMT
(回到石器时代)
-
??内容类型迷魂阵??:浏览器把JSON当文本解析
Content-Type: application/json; charset=utf-8
python复制# FastAPI设置Header的姿势 from fastapi import Response @app.get("/data") def get_data(): content = {"status": "ok"} headers = {"X-Custom-Header": "value"} return Response(content=json.dumps(content), headers=headers, media_type="application/json")
二、JSON返回的四大门派,哪个适合你?
(扶额)新手常问:"返回JSON不就是转个字符串?"太天真!这里头讲究可多了:
??方式?? | ??适用框架?? | ??优点?? | ??坑点?? |
---|---|---|---|
手动序列化 | 任何框架 | 完全可控 | 容易忘加Content-Type |
框架封装方法 | Flask/Django | 自动处理编码 | 扩展性受限 |
流式传输 | 大文件场景 | 节省内存 | 需要处理断连重传 |
第三方库 | FastAPI等 | 支持JSON Schema校验 | 增加依赖包 |
??血泪案例:??
去年有个电商项目,因为用错返回方式,促销价显示成科学计数法(比如99.0变成9.9e+1),一晚上被用户骂上热搜。后来改成json.dumps(ensure_ascii=False, indent=2)
才解决。
三、Header组合拳实战:防盗链+压缩+安全
(敲黑板)光会设单个Header可不行,得学会打组合拳:
??防爬虫三件套:??
X-Content-Type-Options: nosniff
(禁止类型嗅探)X-Frame-Options: DENY
(防点击劫持)Content-Security-Policy: default-src 'self'
(资源加载限制)
??性能优化二连击:??
Content-Encoding: gzip
(记得先压缩数据)Vary: Accept-Encoding
(配合CDN缓存)
??特别提醒:??
- 别在响应头暴露服务器版本!比如
X-Powered-By: PHP/5.6
简直是给黑客递刀 - 移动端一定要加
X-XSS-Protection: 1; mode=block
四、新手必犯的5个Header错误
(叹气)这些坑我当年都跳过,你们可长点心:
-
??跨域头配反了??
把Access-Control-Allow-Headers
写成Access-Control-Allow-Header
(少个s) -
??缓存设置打架??
同时设置Cache-Control: no-cache
和Expires: 未来时间
(浏览器直接懵圈) -
??字符编码埋雷??
Content-Type: application/json
没带charset=utf-8
,中文变乱码 -
??安全头过剩??
给图片接口加HTTP Strict-Transport-Security
,结果CDN不认 -
??大小写乱写??
把content-type
写成Content-Type
(其实没问题,但团队协作时容易引发强迫症)
五、"这设置有什么用?"——真实数据说话
上个月给物流公司做API性能优化,单是??调整Header配置??就带来惊人变化:
- 启用GZIP压缩后,响应体积从2.3MB降到512KB
- 设置
Cache-Control: max-age=3600
,API调用量下降42% - 添加
X-Request-ID
头后,故障排查时间缩短60%
最绝的是在登录接口加上Strict-Transport-Security
,钓鱼攻击尝试直接归零——安全团队给我发了个锦旗(笑)。
说点实在的
干了十年后端开发,越来越觉得??HTTP响应就像写信??。Header是信封上的邮票、挂号标签、保密印章,JSON数据是信纸内容。光把信纸塞进去不行,得把信封信息写周全了,这封信才能准确送达。
记住两个黄金法则:
- ??每次动Header前,先用Postman测试三轮??
- ??返回JSON时,永远先考虑移动端显示效果??
最后送大家个口诀:"编码类型要标明,跨域缓存不能停,安全头是护身符,性能优化看响应"。把这些玩明白了,你就是接口界的"邮政大师"!
(完)
本文由嘻道妙招独家原创,未经允许,严禁转载