如何在Ruby中实现Python requests.session等效的会话请求功能
在Ruby中实现类似Python Requests的会话保持功能
嘿,我懂你想要的那种不用手动折腾Cookie、能自动保持会话的体验——Python的requests.session()确实用着省心!在Ruby里其实也有对应的解决方案,给你两种靠谱的实现方式:
方案1:用Faraday库(推荐,最接近requests.session的体验)
Faraday是Ruby生态里非常流行的HTTP客户端,它支持通过连接对象自动管理会话状态(比如Cookie),用法和requests.session()几乎一致,不用手动处理Cookie的提取和携带。
步骤1:安装Faraday
首先安装这个gem:
gem install faraday
或者在你的Gemfile里添加:
gem 'faraday'
然后执行bundle install。
步骤2:编写会话请求代码
require 'faraday' require 'faraday_middleware' # 用于CookieJar中间件 # 创建一个带会话管理的连接对象 session = Faraday.new(url: "https://test.url.com") do |config| config.use FaradayMiddleware::CookieJar # 启用Cookie Jar自动保存会话Cookie config.adapter Faraday.default_adapter # 使用默认的HTTP适配器(基于Net::HTTP) end # 发送登录请求,Cookie会自动被保存 session.post("/mobile/User/logIn", { username: "test.user@gmail.com", password: "123456abc" }) # 发送后续的订单查询请求,会话Cookie会自动携带 orders_response = session.get("/mobile/User/Order/MyOrders") # 处理响应结果 puts orders_response.status puts orders_response.body
这段代码里,FaradayMiddleware::CookieJar会自动帮你存储登录请求返回的Cookie,后续所有通过这个session对象发送的请求都会自动带上这些Cookie,完全和Python的requests.session()逻辑一致。
方案2:手动用Net::HTTP管理Cookie(无额外依赖)
如果你不想引入新的gem,也可以用Ruby标准库的Net::HTTP手动处理Cookie——其实就是把登录请求得到的Cookie提取出来,在后续请求的请求头里带上。
require 'net/http' require 'uri' # 1. 发送登录请求,获取会话Cookie login_uri = URI("https://test.url.com/mobile/User/logIn") login_params = { username: "test.user@gmail.com", password: "123456abc" } # 发送POST请求 login_response = Net::HTTP.post_form(login_uri, login_params) # 提取返回的Cookie(可能有多个,用分号分隔) session_cookies = login_response.get_fields('Set-Cookie') # 2. 发送订单查询请求,带上刚才获取的Cookie orders_uri = URI("https://test.url.com/mobile/User/Order/MyOrders") orders_request = Net::HTTP::Get.new(orders_uri) # 把Cookie添加到请求头 orders_request['Cookie'] = session_cookies.join('; ') # 发送GET请求 orders_response = Net::HTTP.start(orders_uri.host, orders_uri.port, use_ssl: orders_uri.scheme == 'https') do |http| http.request(orders_request) end # 处理响应 puts orders_response.status puts orders_response.body
这种方式需要自己处理Cookie的提取和拼接,虽然麻烦一点,但不用额外安装依赖,适合对项目依赖有严格要求的场景。
内容的提问来源于stack exchange,提问作者Mesut GUNES
相关产品推荐
相关产品推荐

