如何通过REST API获取媒体URL及下载媒体文件(Ruby开发)
Ruby 调用REST API操作媒体实例的实现方法
直接用Ruby标准库就能实现两类需求,不需要额外依赖第三方gem,具体写法如下:
直接下载媒体文件到本地
核心是请求时声明接收二进制流,不要用文本编码解析响应,大文件建议用流式写入避免占满内存:
require 'net/http' require 'uri' # 替换为实际的媒体实例API地址 media_api_uri = URI("https://你的媒体服务地址/api/v1/media/媒体实例ID") get_req = Net::HTTP::Get.new(media_api_uri) # 替换为实际接口要求的鉴权逻辑,支持API Key、Bearer Token等鉴权方式 get_req["Authorization"] = "Bearer 你的接口访问令牌" # 明确要求服务端返回二进制文件流 get_req["Accept"] = "application/octet-stream" Net::HTTP.start(media_api_uri.host, media_api_uri.port, use_ssl: media_api_uri.scheme == "https") do |http| # 开启自动跟随重定向,适配文件存储在对象存储需要跳转的场景 http.follow_redirects = true http.request(get_req) do |resp| raise "接口请求异常,状态码:#{resp.code}" unless resp.is_a?(Net::HTTPSuccess) # 按实际媒体类型修改保存的文件名和后缀 File.open("download_media_file.mp4", "wb") do |local_file| resp.read_body { |chunk| local_file.write(chunk) } end end end
注意:如果接口返回3xx重定向到对象存储地址,一定要开启自动重定向,不然下载下来的会是重定向响应的文本内容,不是实际文件。
获取媒体访问URL
分两种常见情况处理:
- 接口返回JSON格式媒体元信息:请求时声明接收JSON,从响应字段里取URL即可,一般字段名是
url/access_url/preview_url这类,按实际接口文档调整 - 接口本身为公开访问模式:拼接完成的媒体实例API地址本身就是可直接访问的URL,不需要额外发起请求
对应JSON返回场景的示例代码:
require 'net/http' require 'uri' require 'json' media_api_uri = URI("https://你的媒体服务地址/api/v1/media/媒体实例ID") get_req = Net::HTTP::Get.new(media_api_uri) get_req["Authorization"] = "Bearer 你的接口访问令牌" get_req["Accept"] = "application/json" resp = Net::HTTP.start(media_api_uri.host, media_api_uri.port, use_ssl: media_api_uri.scheme == "https") do |http| http.follow_redirects = true http.request(get_req) end raise "接口请求异常,状态码:#{resp.code}" unless resp.is_a?(Net::HTTPSuccess) media_metadata = JSON.parse(resp.body) # 按实际接口返回结构取对应字段 media_access_url = media_metadata["access_url"] puts "获取到的媒体访问URL:#{media_access_url}"
补充:私有存储的媒体返回的一般是带签名的临时URL,注意有效期,过期后需要重新调用接口生成新的链接。如果平时习惯用httparty、faraday这类HTTP gem,逻辑完全一致,只需要调整对应请求写法即可。
内容的提问来源于stack exchange,提问作者Rob Mason
相关产品推荐
相关产品推荐

