卷土重来的 curl 命令:我如何从一个 404 错误中逃生 📅 2026/7/10 12:10:51 卷土重来的 curl 命令我如何从一个 404 错误中逃生那是一个风和日丽的下午我在公司加班试图通过一段简单的脚本调用一个并不复杂的 API。一切看似正常直到我的屏幕上赫然出现了一个 404 错误而这个 API 明明白白地写在文档的首页。那一刻我怀疑人生怀疑文档甚至怀疑自己几年来的编程经验。经过一番排查我意识到问题可能出在请求头或者请求体上但具体哪里出错却让我百思不得其解。最后是 curl 这个老朋友帮我找到了答案也从那个时候起我决定深入研究这个命令避免再次陷入类似的困境。在开始之前假设你已经对 curl 有所了解但如果你和我一样时不时会因为一个小细节而掉进坑里那么这篇速查手册绝对能帮你快速上手并解决一些常见的问题。我们不会从头到脚地介绍 curl 的每一个功能而是聚焦于那些我曾经踩坑、也可能让你踩坑的点通过具体的例子来解读。一坑未平一坑又起curl 基础命令回顾聊起 curl大家可能首先想到的就是用来发起 HTTP 请求。没错这是它最基础的功能但也是最容易出问题的地方。比如你可能会遇到请求失败、返回数据格式不对等问题。首先我们来看看最基本的 GET 请求curl https://api.example.com/v1/users # 发起 GET 请求这段命令看起来没有什么问题但如果你的 API 需要认证信息比如 API Key直接在 URL 后面跟上-H API-Key: yourkeycurl -H API-Key: yourkey https://api.example.com/v1/users # 添加请求头如果你和我一样一开始没有注意到这一点可能会陷入长时间的调试中。记得那次我因为在请求头中多打了一个空格API 服务器就直接拒绝了我的请求返回了 401 错误。这行命令的-H参数是用来添加 HTTP 头的而API-Key: yourkey是你想要添加的头内容。别小看了这小小的空格它能让你调试几小时。发起 POST 请求数据格式的重要性相比于 GET 请求POST 请求更复杂一些尤其是在处理数据格式时。我记得有一次因为数据格式不正确我在 POST 请求时遇到了一系列问题。正确的做法是使用-d参数来传递数据并确保数据格式正确curl -X POST -H Content-Type: application/json -d {username:john,password:doe} https://api.example.com/v1/login这里-X POST指定了请求方法为 POST。-H Content-Type: application/json告诉服务器我们发送的数据是 JSON 格式而-d参数后面的 JSON 字符串则是实际的数据。如果你的数据格式不对服务器可能会拒收甚至给你返回一些莫名其妙的错误。这次的坑让我深刻体会到了数据格式的严格性。文件上传为何我的文件一直上传失败在处理文件上传时我曾经因为不知道如何正确使用-F参数而困扰了好一阵子。这个参数是用来发送 multipart/form-data 类型的数据非常适合文件上传。假设我们要上传一个名为file.txt的文件到服务器curl -X POST -F file/path/to/file.txt https://api.example.com/v1/upload-F file/path/to/file.txt中符号用来指定文件路径。这里容易踩的坑是文件路径一定要正确而且符号不能省略。我曾因为省略了而一直得不到预期的响应服务器返回的错误信息也不够明确让我花了很长时间才找到问题所在。下载文件为什么文件总是不完整使用 curl 下载文件时如果文件特别大可能会遇到文件不完整的情况。为了确保文件完整下载可以使用-O参数来指定下载的文件名并使用-C -来支持断点续传curl -O -C - https://example.com/largefile.zip-O参数会自动将远程文件名用作本地文件名而-C -可以在下载中断后继续下载。这在下载大文件时尤其有用比如我有一次下载一个几 GB 的视频文件因为网络不稳定下载多次中断最终是curl -O -C -救了我。处理 HTTPS 证书绕过 SSL 验证有时候你可能会遇到 HTTPS 证书验证失败的问题尤其是在使用自签名证书的环境下。这会导致 curl 请求失败报 SSL 错误。你可以使用-k参数来绕过 SSL 证书验证curl -k https://api.example.com/v1/data # 绕过 SSL 证书验证-k参数虽然能解决问题但它会降低安全性让请求更容易受到中间人攻击。因此除非绝对必要否则不建议使用。记得那一次我为了快速解决问题直接加了-k结果第二天就被团队里的安全负责人找去“喝茶”。设置超时时间避免请求卡住在开发环境中API 调用可能会因为各种原因变得缓慢甚至卡住。为了避免一个请求卡死整个脚本可以使用--max-time参数来设置请求的最大超时时间curl --max-time 10 https://api.example.com/v1/slow # 设置 10 秒超时这个参数非常实用尤其是在调用第三方 API 时。我曾经因为忘记设置超时时间导致脚本在请求卡住的情况下无尽地等待影响了整个系统的性能。多个请求头HTTP 头的组合艺术在某些情况下你可能需要发送多个请求头。直接在命令行上使用多个-H参数即可curl -H Content-Type: application/json -H Authorization: Bearer token https://api.example.com/v1/secure这里-H Content-Type: application/json和-H Authorization: Bearer token都是请求头的一部分。我在处理一个需要认证的 API 时始终没有意识到认证头的重要性结果是返回了 403 错误。加上正确的认证头后问题迎刃而解。保存响应到文件不再让终端数据消失有时候你可能需要保存 curl 请求的响应数据到文件中而不是在终端上显示。使用-o参数可以指定输出文件curl -o response.json https://api.example.com/v1/data-o response.json将响应数据保存到response.json文件中。这样你可以随时查看或处理这些数据而不会因为终端的滚动而丢失。我有一次在调试一个生成大量数据的 API 时忘记保存响应结果数据滚动得飞快我根本来不及查看只能重新发起请求浪费了不少时间。跟踪重定向HTTP 重定向的真相有时候API 可能会返回 301 或 302 状态码告诉你请求已被重定向。默认情况下curl 不会自动跟随重定向这可能会导致你得不到预期的数据。使用-L参数可以让 curl 自动跟随重定向curl -L https://api.example.com/v1/redirect-L参数会告诉 curl 自动跟随重定向。我在处理一个需要重定向的 API 时因为没有使用-L导致返回了重定向的 URL 而不是实际的数据。加上-L后一切都变得顺利。发起多请求效率与优雅的结合如果你需要同时发起多个请求可以使用-s参数来静默模式运行避免每个请求的详细输出信息然后通过符号将请求并行执行curl -s https://api.example.com/v1/users curl -s https://api.example.com/v1/posts curl -s https://api.example.com/v1/comments-s参数将 curl 设置为静默模式避免输出详细的请求信息。符号将各个请求并行执行提高效率。我在一次性能测试中因为没有并行执行请求导致整个测试过程非常缓慢。通过并行执行测试时间大大缩短。保持连接避免重复握手在某些高性能场景下你可能需要保持 HTTP 连接避免每次请求都进行握手。使用-H Connection: keep-alive可以实现这一点curl -H Connection: keep-alive https://api.example.com/v1/data-H Connection: keep-alive会使 curl 保持与服务器的连接而不是每次请求后关闭。这在频繁请求时非常有用。我有一次在实现一个实时监控的脚本时因为没有保持连接导致请求频繁卡顿响应时间变长。高级调试查看请求与响应的详细信息在调试复杂的问题时查看请求和响应的详细信息非常有帮助。使用-v参数可以开启 verbose 模式显示所有的通信细节curl -v https://api.example.com/v1/data-v参数开启了详细模式显示每次请求和响应的所有信息包括 HTTP 头和数据。我曾经在一个复杂的 API 调用中因为无法确定问题的根源而极度头疼。开启 verbose 模式后我看到了详细的通信信息最终发现了问题出在某个中间代理上。提取服务器响应码自动化脚本中的判断依据在编写自动化脚本时你可能需要根据服务器的响应码来判断请求是否成功。使用-w参数可以指定输出格式提取响应码curl -o /dev/null -w %{http_code}\n -s https://api.example.com/v1/data-o /dev/null将响应数据丢弃-w %{http_code}\n指定输出格式仅显示 HTTP 响应码。这在脚本中非常有用可以快速判断请求的结果。我在一次自动化部署脚本中因为没有提取响应码导致脚本在请求失败时继续执行最终部署失败。流式处理实时查看响应数据有时候你可能需要实时查看响应数据例如在处理流式 API 时。使用--raw参数可以让 curl 以原始方式输出数据不进行任何处理curl --raw https://api.example.com/v1/stream--raw参数以原始方式输出数据适合处理流式数据。我在调试一个实时数据流时因为没有使用--raw数据被终端处理得乱七八糟根本无法阅读。防止 DNS 缓存解决域名解析问题在调试网络问题时DNS 缓存有时会给你带来麻烦。使用--dns-servers参数可以指定 DNS 服务器防止缓存的影响curl --dns-servers 8.8.8.8 https://api.example.com/v1/data--dns-servers 8.8.8.8指定使用 Google 的 DNS 服务器。我在处理一个跨区域的 API 调用时因为本地 DNS 缓存了错误的 IP 地址导致请求一直失败。切换到 Google 的 DNS 服务器后问题立即解决。安全传输使用代理进行请求在企业环境中你可能需要通过代理来发起请求尤其是在访问外部服务时。使用-x参数可以指定代理服务器curl -x http://proxy.example.com:8080 https://api.example.com/v1/data-x http://proxy.example.com:8080指定代理服务器的地址和端口。我有一次在一个严格内网环境中因为没有通过代理导致请求一直被防火墙拦截。发起带参数的请求GET 请求中的查询参数GET 请求中有时需要传递查询参数这在 curl 中非常简单。直接在 URL 后面加上?keyvalue即可curl https://api.example.com/v1/users?namejohnage30这里?namejohnage30是查询参数。我在处理一个需要查询特定用户的 API 时因为忘记添加查询参数返回了所有用户的信息。加上查询参数后响应内容变得精确。验证请求使用不同的 HTTP 方法除了 POST 和 GETcurl 还支持其他 HTTP 方法如 PUT、DELETE 等。使用-X参数可以指定请求方法curl -X PUT -d {name:john,age:30} https://api.example.com/v1/user/1-X PUT指定请求方法为 PUT-d {name:john,age:30}是发送的数据。我在处理一个需要更新用户信息的 API 时因为用错了请求方法导致数据被创建而不是更新。正确使用PUT方法后问题解决。利用 Hey Cron 提升效率聊完 curl再来分享一点额外的小技巧。在日常开发中除了 curl我还经常使用 Hey Cron 来提升效率。Hey Cron 是一个免费的在线工具网站提供了多种实用工具比如Cron 表达式生成器通过中文描述自动生成 cron 表达式再也不用翻查那些复杂的文档。正则表达式生成器轻松生成复杂的正则表达式支持在线测试非常方便。中英互译快速翻译文档、注释等提高工作效率。JSON 格式化格式化 JSON 数据便于阅读和调试。Base64 编码解码快速编码和解码 Base64 字符串适合处理 API 参数。时间戳转换在时间戳和人类可读的时间之间轻松转换。JWT 解析解析 JWT 令牌查看其中的内容。这些工具在开发过程中都非常实用希望你也能从中受益。毕竟开发中的小工具就像我们编程时的小锤子用得顺手了效率自然就上去了。希望这篇速查手册能让你在使用 curl 时更加得心应手避免掉入类似的坑中。如果你有任何问题或建议欢迎在评论区交流。一起进步一起踩坑一起解决问题。加油