跳到主要内容

HTTP 请求

后端 Ruby 代码中用到的 HTTP 客户端库主要有:

  • Net::HTTP: Ruby 标准库自带的 HTTP 客户端,无需安装额外依赖
  • HTTParty: 对 Net::HTTP 的封装,调用更简洁,开源项目 GitLab 有在使用
  • http.rb: 支持链式调用和流式处理,不基于 Net::HTTP 而是依赖原生的 llhttp 解析器

参考 OpenTelemetry instrumentation libraries,常用的 Ruby HTTP 客户端库还有 Faraday、Typhoeus、Excon、RestClient 等,主要特点如下:

  • Faraday: 支持多种适配器,默认使用 Net::HTTP,可以按需切换后端实现
  • Excon: 仅支持 HTTP/1.1 协议,对于 multipart 请求可能需要手动构造请求体
  • HTTPX: 支持 HTTP/2 和 HTTP/1.X 协议,链式调用,默认启用并发请求特性
  • Typhoeus: 最后版本 1.5.0 发布于2025年8月,前一版本 1.4.1 发布于2023年11月,不再活跃维护
  • Patron: 最后版本 0.13.4 发布于2025年2月,前一版本 0.13.3 发布于2019年5月,不再活跃维护
  • HTTPClient: 最后版本 2.9.0 发布于2025年2月,前一版本 2.8.3 发布于2016年12月,不再活跃维护
  • RestClient: 最后版本 2.1.0 发布于2019年8月,已停止维护

参考来源:

常规 GET 请求

curl https://postman-echo.com/get

示例响应:

{
"args": {},
"headers": {
"host": "postman-echo.com",
"accept": "*/*",
"accept-encoding": "gzip, br",
"x-forwarded-proto": "https",
"user-agent": "curl/8.17.0"
},
"url": "https://postman-echo.com/get"
}

以 POST 方式发送 JSON 数据

curl -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer CakjU0VzcuBr6A3LyveTOTaPzBM1XZw7' \
--data-raw '{"key1":"value1","key2":"测试 中文"}' \
https://postman-echo.com/post

示例响应:

{
"args": {},
"data": {
"key1": "value1",
"key2": "测试 中文"
},
"files": {},
"form": {},
"headers": {
"host": "postman-echo.com",
"content-length": "40",
"accept-encoding": "gzip, br",
"x-forwarded-proto": "https",
"content-type": "application/json",
"accept": "*/*",
"user-agent": "curl/8.17.0",
"authorization": "Bearer CakjU0VzcuBr6A3LyveTOTaPzBM1XZw7"
},
"json": {
"key1": "value1",
"key2": "测试 中文"
},
"url": "https://postman-echo.com/post"
}

以 Multipart 方式上传文件

echo 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=' | base64 -d > /tmp/1x1.png
curl -X POST \
-F key1=value1 \
-F key2='测试 中文' \
-F file=@/tmp/1x1.png \
https://postman-echo.com/post

示例响应:

{
"args": {},
"data": {},
"files": {
"1x1.png": "data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
},
"form": {
"key1": "value1",
"key2": "测试 中文"
},
"headers": {
"host": "postman-echo.com",
"content-length": "508",
"accept-encoding": "gzip, br",
"x-forwarded-proto": "https",
"accept": "*/*",
"user-agent": "curl/8.17.0",
"content-type": "multipart/form-data; boundary=------------------------krMvKoMR5awocDTeHeJ4Qv"
},
"json": null,
"url": "https://postman-echo.com/post"
}