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>
关键改动说明
- JSON解析逻辑修正:把
JSON.parse(response)的结果存入parsed_response变量,通过这个哈希才能正确访问results和searched_count字段,这是获取数据的核心。 - 动态URL构造:用
URI.encode_www_form_component(term)处理搜索词,避免空格、特殊字符导致URL失效,同时让函数支持任意关键词查询。 - 错误捕获机制:添加
begin-rescue块捕获请求或解析异常,调试时能直接看到具体错误信息,不用瞎猜问题出在哪。 - 表单路由调整:把表单
action改为当前路由/,提交后会回到首页处理请求,同时通过value="<%= params[:term] || '' %>"保留用户输入的关键词,提升体验。 - 模板数据传递:在首页路由里判断是否有
term参数,调用函数获取结果后赋值给@paragraph,让erb模板能直接渲染这个数值。
验证方法
运行Sinatra应用后,打开浏览器访问http://localhost:4567,输入关键词提交就能看到对应的搜索次数;同时可以查看控制台输出,确认API返回的完整数据结构,确保数据路径正确。
内容的提问来源于stack exchange,提问作者Alex Salinas
相关产品推荐
相关产品推荐

