You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby Sinatra调用Udemy API提取searched_count字段求助

解决Udemy API数据提取与页面展示问题

我来帮你梳理下代码里的问题,一步步搞定数据获取和页面展示的难题:

核心问题分析

你的代码里有几个关键疏漏导致无法正确获取并展示数据:

  • JSON解析结果未留存:你调用了JSON.parse(response)但没把解析后的哈希赋值给变量,直接用原字符串response去访问哈希键——字符串可没有[]方法来读取键值对,这肯定行不通。
  • 搜索词硬编码:get_search_count函数里的URL固定写死了q=java,完全没用到传入的term参数,等于不管传什么搜索词都只会查Java的结果。
  • 表单提交目标错误:表单的action指向了/action_page.php,但你用的是Sinatra框架,应该指向自己定义的路由才对。
  • 数据未传递到模板:没有把获取到的searched_count赋值给erb模板的实例变量,页面自然没法渲染这个数值。

修正后的完整代码

1. 更新web.rb代码

require 'sinatra'
require 'net/http'
require 'json'
require 'openssl'

# 注意:关闭SSL验证仅适合测试环境,生产环境建议配置合法证书
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

def get_search_count(term)
  # 用传入的term参数动态构造URL,同时编码特殊字符避免URL错误
  url = "https://www.udemy.com/api-2.0/search-suggestions?q=#{URI.encode_www_form_component(term)}"
  uri = URI(url)
  
  begin
    response = Net::HTTP.get(uri)
    # 将解析后的JSON哈希存入变量,后续通过这个变量访问数据
    parsed_response = JSON.parse(response)
    
    # 调试用:控制台打印完整响应,方便确认数据结构
    puts "API响应内容:#{parsed_response}"
    
    # 先检查results数组是否存在且非空,再取第一个元素的searched_count
    if parsed_response["results"] && !parsed_response["results"].empty?
      return parsed_response["results"][0]["searched_count"]
    else
      return "未找到 '#{term}' 的搜索结果"
    end
  rescue => e
    # 捕获请求或解析错误,方便排查问题
    return "获取数据失败:#{e.message}"
  end
end

# 首页路由,负责渲染表单和展示结果
get '/' do
  @title = "Udemy搜索次数查询"
  @headline = "查询Udemy关键词搜索次数"
  # 如果有提交的term参数,就调用函数获取数据并赋值给模板变量
  if params[:term]
    @paragraph = "关键词 '#{params[:term]}' 的搜索次数:#{get_search_count(params[:term])}"
  else
    @paragraph = "请输入上方关键词进行查询"
  end
  erb :index
end

2. 更新index.erb代码

<html>
<head>
<title><%= @title %></title>
</head>
<body>
<h1><%= @headline %></h1>
<p><%= @paragraph %></p>
<!-- 把表单提交目标改为当前路由,同时保留用户输入的关键词 -->
<form action="/" method="get">
Search Term: <input type="text" name="term" value="<%= params[:term] || '' %>"><br>
<input type="submit" value="查询">
</form>
</body>
</html>

关键改动说明

  1. JSON解析逻辑修正:把JSON.parse(response)的结果存入parsed_response变量,通过这个哈希才能正确访问results和searched_count字段,这是获取数据的核心。
  2. 动态URL构造:用URI.encode_www_form_component(term)处理搜索词,避免空格、特殊字符导致URL失效,同时让函数支持任意关键词查询。
  3. 错误捕获机制:添加begin-rescue块捕获请求或解析异常,调试时能直接看到具体错误信息,不用瞎猜问题出在哪。
  4. 表单路由调整:把表单action改为当前路由/,提交后会回到首页处理请求,同时通过value="<%= params[:term] || '' %>"保留用户输入的关键词,提升体验。
  5. 模板数据传递:在首页路由里判断是否有term参数,调用函数获取结果后赋值给@paragraph,让erb模板能直接渲染这个数值。

验证方法

运行Sinatra应用后,打开浏览器访问http://localhost:4567,输入关键词提交就能看到对应的搜索次数;同时可以查看控制台输出,确认API返回的完整数据结构,确保数据路径正确。

内容的提问来源于stack exchange,提问作者Alex Salinas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:47:19