GET与POST传参的隐藏陷阱:URL编码、Content-Type与中文乱码

1. 先别急着写代码:GET和POST传参的真正差异在哪里

作为一个写过无数接口、也调试过无数接口的人,我几乎每天都要面对GET和POST传参这件事。你可能觉得这有什么好讲的,小学生都会,但实际工作里,因为"参数没传对"导致的前后端扯皮、线上故障,我真的见过太多。

先抛一个最典型的场景:前端同学说"我明明POST传了参数,为什么后端收不到";后端同学说"我明明写了接口,为什么前端传的参数全是undefined"。这种互相甩锅的局面,十有八九不是代码写错了,而是对"参数到底放在哪里、以什么格式放"的理解出现了偏差。

先说结论,后面慢慢展开:

  • GET请求的参数,本质上是通过URL的查询字符串(query string)传递的,也就是URL里"?"后面的部分。
  • POST请求的参数传递方式要复杂得多,可以放在URL的查询字符串里,也可以放在请求体(request body)里,而请求体又因为Content-Type取值不同,有完全不同的编码格式。

这两个结论看起来简单,但背后的编码规则、服务端解析逻辑、特殊字符处理方式,藏着巨多的坑。这篇文章我就把自己的实测记录和踩坑经历整理出来,从参数在网络上到底长什么样开始,一直讲到后端代码里常见的接收错误,希望能帮你省下几个加班的夜晚。

先说个简单的类比。GET传参就像你在一张快递单的"备注"栏里写字,POST传参就像把一张表格塞进快递包裹里。快递单上的备注栏是公开的,路过的人都能看到;包裹里的表格别人看不见,只有收件人拆开包裹才知道里面写了什么。但问题在于:备注栏写字有固定的格式要求(比如不能有某些特殊符号,否则就看不懂),包裹里的表格也有格式要求(是纯文本还是JSON,得提前商量好)。很多人栽跟头,就是栽在这两种"格式要求"上。

2. GET请求发送普通参数:URL查询字符串背后的编码规则

2.1 查询字符串的基本结构

一个完整的GET请求URL长这样:

https://example.com/api/users?page=1&size=20&keyword=alice&sort=desc

其中?后面到URL结束的部分,就是查询字符串。你看这个结构,本质上就是一个键值对的集合,多个键值对之间用&连接,键和值之间用=连接。

这里有三条基本规则是初学者最容易忽略的:

  1. 参数只能使用ASCII字符集。URL本身只允许ASCII字符,中文字符、空格、%、&、+这些特殊字符直接拼进去是会被解析乱的。
  2. 键和值都必须进行URL编码。举个例子,如果keyword的值是hello world,直接拼成?keyword=hello world是错的,空格会被当成分隔符或在某些环境下被截断,必须编码成hello%20world。
  3. 空值参数到底带不带=,各框架处理方式不一致。有些框架认为?keyword(不带=)和?keyword=(带=)是有区别的,联调时最好统一写法。

我用一个实际的模拟项目X来演示。假设你要查询用户列表,筛选条件是姓名包含"张三"、年龄大于18、按创建时间倒序。那么正确拼接URL的步骤是:

import urllib.parse base_url = "https://example.com/api/users" params = { "name": "张三", "age_min": 18, "order": "desc" } # 必须对每个键值对单独编码 encoded_pairs = [] for key, value in params.items(): encoded_key = urllib.parse.quote(str(key), safe="") encoded_value = urllib.parse.quote(str(value), safe="") encoded_pairs.append(f"{encoded_key}={encoded_value}") query_string = "&".join(encoded_pairs) full_url = f"{base_url}?{query_string}" print(full_url) # 输出: https://example.com/api/users?name=%E5%BC%A0%E4%B8%89&age_min=18&order=desc

你会发现"张三"变成了%E5%BC%A0%E4%B8%89。这就是URL编码的结果:中文按UTF-8编码后每个字节转成%XX的十六进制形式。服务端拿到这一串字符后,再用同样的UTF-8解码,就能还原成"张三"。

2.2 哪些特殊字符必须编码,怎么编码

我整理过一张常用字符的编码对照表,每次写底层HTTP客户端的时候都会翻出来看一眼:

原始字符编码后场景说明
空格%20或+空格是最常见的坑,表单默认用+,URL标准用%20
&%26如果不转义,会被拆成两个参数
=%3D如果不转义,会被当成键值分隔符
%%25百分号本身必须转义,否则后两位会被当十六进制
+%2B加号在query里通常被解码为空格,必须转义
#%23如果不转义,#后面的内容会被当成锚点,根本不会发给服务器
?%3F如果不转义,会开启新的参数段
中文UTF-8逐字节转%XX编码结果通常形如%E5%BC%A0
单引号'%27某些旧系统里单引号可能引发安全问题,建议转义
双引号"%22某些场景下双引号会被截断或引发解析问题

这里我特别想强调#的问题。有一次某同事排查了半天,发现请求一直发不过去,参数也不对,最后才发现URL里有个#,浏览器把后面的内容全当成锚点在页面上跳转了,网络面板里根本没有发出带那些参数的请求。这个例子非常典型:URL编码不仅仅是为了让服务器正确解析,更是为了确保你的请求在客户端环节就不会被截断。

2.3 GET传参时,后端是怎么拿到这些值的

以最常见的几种服务端框架为例,我们看一下GET参数在后端代码里的标准接收方式。以一个Java Servlet风格的接口为例:

// 假设请求: GET /api/users?name=张三&age=18 @WebServlet("/api/users") public class UserServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { // 方式1: 精确获取单个参数 String name = request.getParameter("name"); String age = request.getParameter("age"); // 方式2: 一次性获取所有参数 Map<String, String[]> paramMap = request.getParameterMap(); // 注意这里返回值是 String[],因为一个键可能对应多个值 } }

再比如Spring Boot里用注解接收:

@RestController public class UserController { // GET /api/users?name=张三&age=18&tag=admin&tag=vip @GetMapping("/api/users") public String getUsers( @RequestParam("name") String name, @RequestParam(value = "age", required = false, defaultValue = "0") Integer age, // 一个键多个值的情况,要用 List 接收 @RequestParam(value = "tag", required = false) List<String> tags) { return "name=" + name + ", age=" + age + ", tags=" + tags; } }

这里有个非常关键的细节:@RequestParam底层在解析时,会自动对URL编码后的字符串做一次URL解码。也就是说,你传的是%E5%BC%A0%E4%B8%89,框架已经帮你解成了"张三",你拿到手就是中文。这个自动解码的过程,正是很多误解的根源——有人以为后端拿到手也应该是编码后的字符串,于是自己又手动解了一次,导致乱码。

我自己实测过的一个教训是:如果服务端容器默认的字符集不是UTF-8,比如Tomcat 8以前版本默认ISO-8859-1,那么request.getParameter()拿到的中文可能直接就是乱码。所以你在本地开发正常,部署到某个老环境就出现乱码,先去检查容器和框架的编码配置。

3. POST请求发送普通参数:Content-Type决定一切

3.1 请求体里的编码格式由Content-Type说了算

POST请求和GET请求最大的区别在于:POST的主体可以放在请求体里。但请求体本身是一个二进制流,服务器得知道"你怎么组织这些字节",才能正确解析出参数。这个"解释说明"就是Content-Type请求头。

常见的三种Content-Type,处理参数的方式完全不同:

Content-Type参数格式典型场景
application/x-www-form-urlencoded和URL查询字符串格式一样,key=value&key2=value2,但body里的空格通常编码成+传统HTML表单提交、绝大多数普通参数接口
application/jsonJSON字符串,如{"name":"张三","age":18}前后端分离的现代接口、嵌套结构参数
multipart/form-data多段二进制封装,每段有独立头信息和内容文件上传,但也能传普通字段

如果你不主动设置Content-Type,很多HTTP客户端库会有默认值。比如浏览器的form.submit()默认就是application/x-www-form-urlencoded,这也就是"普通参数"最常用的POST传参方式。我今天重点讲这种格式,因为它最贴近标题里"发送普通参数"这件事。

3.2 form-urlencoded格式的编码细节和坑

这种格式的body内容长这样:

name=%E5%BC%A0%E4%B8%89&age=18&city=Beijing

和URL查询字符串的键值对结构几乎一样,唯一的区别在于空格的处理:application/x-www-form-urlencoded标准明确要求空格编码为+,而不是%20。但关键是,大多数服务端框架在解析时是兼容这两种的,你传+能解成空格,传%20也能解成空格。

真正容易出问题的场景是+号本身作为数据的时候。假设你要传一个邮箱地址test+123@example.com,如果直接放进body里:

email=test+123@example.com

服务端正常按form-urlencoded解析,会把+解码成空格,最终你拿到的是test 123@example.com。正确的做法是先把+转义成%2B:

email=test%2B123@example.com

所以我在封装HTTP请求工具的时候,一直坚持一个原则:所有参数值,不管看起来多安全,都要做一次encodeURIComponent级别的编码。不要相信"我觉得这个字符串里没有特殊字符"这种判断。

再演示一个用代码构造POST body的例子,以Python requests为例:

import requests # 方式1: 直接传 dict,requests 会自动编码为 form-urlencoded resp1 = requests.post( "https://example.com/api/login", data={ "username": "张三", "password": "p@ss+word", "remark": "a b c" } ) # 实际发出的body: username=%E5%BC%A0%E4%B8%89&password=p%40ss%2Bword&remark=a+b+c # 方式2: 手动先编码再传 from urllib.parse import urlencode body_str = urlencode({ "username": "张三", "password": "p@ss+word", "remark": "a b c" }) resp2 = requests.post( "https://example.com/api/login", data=body_str, headers={"Content-Type": "application/x-www-form-urlencoded"} )

两种方式最终效果是一样的,但底层做的事你需要清楚:requests库拿到dict之后,内部会调用urlencode进行编码,同时自动设置Content-Type为application/x-www-form-urlencoded。如果你自己手动传入字符串,那就必须自己设置Content-Type,否则服务器可能按其他格式解析,导致参数失败。

3.3 POST参数放在URL里和放在body里的优先级问题

这里有一个很容易被忽略的经典场景:POST请求的URL上也能带查询字符串,body里也能带参数。比如:

POST /api/orders?channel=mobile&debug=1 Content-Type: application/x-www-form-urlencoded user_id=1001&goods_id=8888

那么问题来了:服务端怎么区分哪些参数来自URL,哪些来自body?

答案是:不同框架的处理方式不同,甚至同一个框架在不同配置下也不同。

Java Servlet 规范里,request.getParameter()是一个统一接口,它会同时合并URL查询字符串和body里的参数。如果同一个键两边都有值,URL里的值优先。但这种方式很坑,因为一旦URL里有debug=1,body里也有debug=0,你分不清到底哪个生效。

Spring Boot里则更明确:@RequestParam同样会合并两边来源;@RequestBody则只解析body内容,完全不看URL。

这里我建议你养成的习惯是:POST请求的参数,全部统一放body;URL上的查询字符串只用于路由级别的标识,比如版本号、追踪ID,不放业务参数。否则一旦出现同名参数,前后端各写各的,调试起来真的想砸键盘。

我在内置的某内部管理系统联调时,就遇到过前端同学把token放在URL上,把userId放在body里,后端又用@RequestParam("token")接收。结果是:token正常收到了,userId也正常收到了,看起来一切正常。直到有一天URL上的token里出现了一个&,整个请求被截断,所有参数都丢了。排查到最后,发现根源不是代码逻辑,而是URL参数没有编码、且URL参数混用导致的可读性灾难。

3.4 多选参数、数组参数在POST里的表达方式

普通参数的另一个常见变形是"一个键多个值",比如一个多选框提交的值:tag同时有admin和vip两个值。

在application/x-www-form-urlencoded格式里,多值参数的表达方式是重复同一个键:

tag=admin&tag=vip&tag=normal

后端接收方式根据框架不同有所差异。Java里用request.getParameterValues("tag")拿数组;Spring Boot里用List<String>接收;Node.js Express里用req.body.tag拿到的是一个数组。这个格式你不需要任何特殊编码,就是把相同的键多写几遍。

还有一种约定俗称的写法是把多个值用逗号拼成一个字符串传:

tags=admin,vip,normal

但这种写法有个明显的缺陷:如果值本身包含逗号,你根本分不清哪些是分隔符、哪些是数据。我实测过不同团队的做法,总结下来就是:用重复键的方式传多值是最标准的,兼容性最好;逗号拼接的方式尽量只在值本身不含逗号时使用。

4. 中文乱码与特殊字符:实测记录和解决方案

4.1 乱码是怎么发生的:一图看懂编码链条

乱码问题的本质是:发送端用A编码方式把字符变成字节序列,接收端用B编码方式把字节序列还原成字符,A和B不一致,于是出现乱码。

以"爱"字为例,UTF-8编码后的字节是E7 88 B1,GBK编码后的字节是B0 AE。如果发送端按GBK编码送出B0 AE,接收端却按UTF-8解码,得到的就是不认识的字。这就是编码不一致的乱码。

在GET/POST传参场景里,涉及两个独立环节的编码:

  1. 客户端把字符串编码为URL编码形式。这里有一个隐藏编码:URL编码本身不涉及字符集,但它把"字符"转换为字节时要用字符集。大多数现代系统默认UTF-8。
  2. 服务端拿到URL编码后的字符串,解码还原时也要用字符集。这一步的字符集往往由容器、框架、操作系统环境决定。

我做过一个实测对比,记录了同一个中文参数"张三"在不同编码组合下的结果:

客户端编码服务端解码结果
UTF-8UTF-8张三,正常
UTF-8ISO-8859-1乱码,形如å¼ ä¸
UTF-8GBK乱码,形如寮犱笁
GBKUTF-8乱码,形如寮犱笁
GBKGBK张三,正常

这个表格解释了为什么"本地好好的,测试环境就乱了"。很多时候就是容器默认字符集不一致。

4.2 前后端联调时的编码约定

我的经验是,在项目初始化阶段就要明确三件事,写进团队wiki:

  1. 全链路统一使用UTF-8。包括HTML页面编码、JavaScript字符串编码、HTTP请求头Content-Type里的charset、服务端容器编码、数据库连接编码。
  2. 所有URL参数必须经过encodeURIComponent编码后再拼接。不要相信浏览器会自动帮你编码,不同场景下浏览器的行为并不一致。
  3. 服务端一律在请求入口配置编码过滤器,强制按UTF-8解析。Java里有专门的CharacterEncodingFilter,Spring Boot可以在application.properties里设置server.servlet.encoding.charset=UTF-8。

我一个曾经维护过的老项目就是典型的反面教材。页面是GBK编码的老系统,接口却是按UTF-8接收的。前端每次传中文都要手动转成Unicode转义序列再传给后端,后端再解析回来。这个方案虽然能工作,但一旦有人忘记编码,就会出现"用户反馈搜索功能搜不到中文名字"这种价值几个小时的排查问题。后来我们花了半天时间把全链路统一成UTF-8,问题彻底消失。

4.3 特殊字符导致的参数截断故障实录

再分享一个印象深刻的故障排查过程。某跨平台系统的登录接口突然在某些用户手机上失效,我和同事排查了很久。复现步骤是:用某品牌手机自带浏览器打开登录页,输入含#的密码提交,发现后端拿到的密码总是不对。

完整的排查链路是这样的:

  1. 先看网络面板,发现请求确实发出去了,URL和body都有值。
  2. 用Charles抓包,确认body里的密码字段被编码成了password=abc%23def。
  3. 在后端加日志,打印接收到的password,发现是abc,#def不见了。
  4. 检查服务端框架,发现框架对body的解析没问题,但URL里的#之后内容被安全模块剥离了。
  5. 最终定位:这个框架有一个全局的URL净化逻辑,任何参数值里的#都会把它后面的内容当成URL片段去掉。

解决方案:要么在框架里关闭这个净化逻辑,要么前端对密码里的#做双重编码后再解码。我们最后选择关闭净化逻辑,因为让业务去适配框架的奇怪行为风险太大。

这个案例想说明的是:特殊字符的坑不会只在客户端出现,服务端中间件、网关、防火墙都可能对请求做二次解析。排查这种问题,一定要全链路抓包,看最原始的网络流量,而不是只看框架层的日志。

5. 综合实测:用一段代码同时演示GET和POST普通参数的正确姿势

5.1 一个可复现的完整Demo

为了让你能直接跑起来对照,我写一个极简的Flask后端加Python客户端,完整演示GET和POST发送普通参数的正确做法。

服务端代码:

from flask import Flask, request app = Flask(__name__) # 处理 GET 请求 @app.route("/api/get-demo", methods=["GET"]) def get_demo(): name = request.args.get("name", "") age = request.args.get("age", "") return f"GET 收到: name={name}, age={age}" # 处理 POST 请求,解析 form-urlencoded @app.route("/api/post-demo", methods=["POST"]) def post_demo(): name = request.form.get("name", "") age = request.form.get("age", "") email = request.form.get("email", "") return f"POST 收到: name={name}, age={age}, email={email}" if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)

客户端代码:

import requests from urllib.parse import urlencode # ---------- GET 请求 ---------- params = { "name": "张三", "age": 18 } # 手工拼URL query = urlencode(params) full_url = f"http://127.0.0.1:5000/api/get-demo?{query}" resp = requests.get(full_url) print("GET 响应:", resp.text) # ---------- POST 请求 ---------- post_data = { "name": "李四", "age": 25, "email": "test+123@example.com" } resp = requests.post( "http://127.0.0.1:5000/api/post-demo", data=post_data, # requests自动编码为 form-urlencoded ) print("POST 响应:", resp.text)

我自己实测下来的输出是:

GET 响应: GET 收到: name=张三, age=18 POST 响应: POST 收到: name=李四, age=25, email=test+123@example.com

注意email字段里的+被正确还原成了+,这是因为requests在编码时把+转义成了%2B,服务端解码时还原了。

5.2 实测过程中发现的三个坑

这个Demo我反复跑过很多次,每次都会有人问同样的问题,我把最常见的三个坑写在这里:

第一个坑:Flask的request.args只解析URL查询字符串,request.form只解析body里的form数据。如果你把参数放到错误的地方,得到的永远是默认值。这提醒我:写服务端代码时,第一件事是确定参数来源,而不是从头到尾用同一个方法取参。

第二个坑:某些HTTP客户端库,比如requests,当data传dict时,如果某个键对应的值是None,它会把该键省略掉,而不是传一个空值。这和部分语言的行为不一样,容易造成前后端理解偏差。

第三个坑:data传字符串和传dict的行为不同。传dict时requests自动设置Content-Type为form-urlencoded;传字符串时它默认不设置Content-Type,很多框架拿不到body参数。所以如果你手动构造了body字符串,务必显式设置headers={"Content-Type": "application/x-www-form-urlencoded"}。

5.3 用CurL命令做快速验证,定位前端还是后端问题

最后分享一个我在联调时最常用的排查手段:先用curl命令模拟一个最原始的请求,确认后端接口本身是通的、参数解析是对的。如果curl能正常返回,那问题大概率在前端构造请求的环节。

GET请求的curl命令:

curl "http://127.0.0.1:5000/api/get-demo?name=%E5%BC%A0%E4%B8%89&age=18"

POST请求的curl命令:

curl -X POST "http://127.0.0.1:5000/api/post-demo" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "name=%E6%9D%8E%E5%9B%9B&age=25&email=test%2B123%40example.com"

这种方式的好处是绕开了浏览器、绕开了前端框架,直接测试服务端本身。如果curl返回正常,再从前端逐步排查;如果curl也返回乱码或参数为空,那就说明是服务端解析逻辑或编码配置的问题,不用再折腾前端了。

在实际项目调试中,这个"分层排查"的思路非常有用。曾经某团队前后端争论了三天的参数问题,我远程帮他们用curl一测,三分钟就定位到了是前端拦截器把参数里的%二次解码成了空格。所以建议你把这个curl命令模板收藏,有问题先跑一遍。

我个人的体会是:GET和POST发普通参数这件事,表面上是"写代码"的问题,本质上是对"参数在哪里""用什么格式""经过哪些编码"这三个问题的理解。把这三点摸透了,你不仅能解决自己项目里的bug,还能帮同事排查问题,成为团队里"那个什么接口问题都能搞定的人"。

相关新闻

在NAS上用Docker部署YesPlayMusic:打造全家人使用的干净网易云音乐播放器

在NAS上用Docker部署YesPlayMusic:打造全家人使用的干净网易云音乐播放器

我把家里的NAS当成一个长期运行的“家庭服务器”来用&#xff0c;除了存照片、跑下载任务、备份手机相册之外&#xff0c;最近折腾的最值的一件事&#xff0c;是把第三方网易云音乐播放器YesPlayMusic部署了上去。现在全家任何一台设备&#xff0c;只要打开浏览器输入地址&…

2026/10/21 5:41:15 阅读更多 →
NFS服务端运维实战:从部署配置到性能调优与安全加固

NFS服务端运维实战:从部署配置到性能调优与安全加固

NFS服务端常用操作这件事&#xff0c;听起来无非是装个包、改一行exports、重启下服务。但真正把一台NFS服务端当作生产环境里的存储入口来维护时&#xff0c;你会发现协议的版本选择、用户权限映射、端口规划、线程数调整、异常挂载处理&#xff0c;每一项都有自己的门道。这份…

2026/10/21 5:41:15 阅读更多 →
.NET Core 3.1容器化部署实战:Docker镜像优化与K8s生产落地

.NET Core 3.1容器化部署实战:Docker镜像优化与K8s生产落地

1. 项目概述&#xff1a;为什么.NET Core 3.1 Docker这个组合至今仍值得深挖我第一次在生产环境把一个订单核验服务从Windows Server IIS迁到Linux容器里&#xff0c;用的就是.NET Core 3.1 Docker。那会儿是2020年中&#xff0c;团队里还有人质疑“微软的东西跑Linux靠谱吗”…

2026/10/21 5:41:15 阅读更多 →

最新新闻

Windows下Git详细配置指南:解决SSH、换行符与路径兼容问题

Windows下Git详细配置指南:解决SSH、换行符与路径兼容问题

1. 项目概述&#xff1a;为什么Windows用户需要一套“能抄作业”的Git配置方案Git不是装上就能用的工具&#xff0c;它更像一把没开刃的刀——版本控制能力藏在配置细节里。我见过太多刚接触Git的Windows用户&#xff0c;在命令行里敲出git clone后卡在“Permission denied (pu…

2026/10/21 6:18:32 阅读更多 →
操作系统课后习题答案这样用:从信号量到银行家算法真正吃透考点

操作系统课后习题答案这样用:从信号量到银行家算法真正吃透考点

简介&#xff1a;这是计算机操作系统教程&#xff08;左万利、王英第四版&#xff09;的课后习题答案文档&#xff0c;面向高校计算机专业学生及考研复习者&#xff0c;覆盖操作系统核心考点&#xff1a;进程管理、调度算法、死锁避免、银行家算法、读者与写者问题等。内容以典…

2026/10/21 6:18:32 阅读更多 →
SRC越权漏洞实战:从接口梳理到水平垂直越权挖掘

SRC越权漏洞实战:从接口梳理到水平垂直越权挖掘

1. 越权漏洞为什么是SRC的“常青树”做SRC挖洞这几年&#xff0c;我最大的感受就是&#xff1a;SQL注入和RCE越来越难撞&#xff0c;但越权漏洞就像韭菜一样&#xff0c;割完一茬又长一茬。你登录了自己的账号&#xff0c;结果能把别人的订单查出来、把别人的资料改掉&#xff…

2026/10/21 6:18:32 阅读更多 →
Linux KVM下NVIDIA显卡直通Windows虚拟机完整指南与防坑手册

Linux KVM下NVIDIA显卡直通Windows虚拟机完整指南与防坑手册

1. 直通这件事&#xff0c;到底在干什么1.1 什么是显卡直通&#xff0c;为什么要折腾它显卡直通&#xff08;GPU Passthrough&#xff09;是我玩虚拟化以来&#xff0c;觉得最实用也最折腾的一个功能。简单说&#xff0c;就是把一张英伟达独立显卡完整地交给一台虚拟机独占&…

2026/10/21 6:18:32 阅读更多 →
JWT靶场实战:弱密钥爆破、算法混淆与签名校验缺失全套路解析

JWT靶场实战:弱密钥爆破、算法混淆与签名校验缺失全套路解析

JWT 这东西&#xff0c;平时在业务系统里就是个“门禁卡”&#xff0c;后端一验签、一解包&#xff0c;就知道你是谁、能进哪个房间。可在靶场里&#xff0c;它就是一套出题人精心布置的机关&#xff0c;表面看三段字符串长得差不多&#xff0c;实际坑位一个比一个深。我近期把…

2026/10/21 6:18:32 阅读更多 →
Kubernetes资源对象详解:从Pod、StatefulSet到Ceph RBD持久化存储

Kubernetes资源对象详解:从Pod、StatefulSet到Ceph RBD持久化存储

这个系列写到第7篇&#xff0c;终于轮到K8s资源对象里最容易把人绕晕的一块了。Pod、Deployment、Service、StatefulSet、DaemonSet、Volume、PV、PVC&#xff0c;每个名词单独看都能找到一堆文档&#xff0c;可真到要把它们串起来、并且接入Ceph这种外置分布式存储的时候&…

2026/10/21 6:17:31 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →