调用YouTubei v1 API遇405错误,Leanback Lite v3加载失败求助
问题排查与修复方案
核心问题原因
- 请求方法错误:YouTube i API(
youtubei/v1)的所有接口仅支持POST请求,你的代码通过GET方式访问,直接触发405 Method Not Allowed错误。 - 端点与参数格式错误:
- 基础URL
https://www.googleapis.com/youtubei/v1/并非有效接口,必须指定具体操作端点(如/search); - 该API要求参数以JSON格式放在请求体中,而非URL拼接,且不支持
alt=xml参数(仅返回JSON响应)。
- 基础URL
- API调用逻辑不匹配:Leanback Lite的
InnerTubeDataFetcher默认可能使用GET,需显式指定POST请求并携带正确的请求体。
具体修复步骤
1. 修正API端点与请求参数
将URL_BASE改为具体的有效端点,并移除URL参数拼接逻辑,改为在请求体中传递参数。
2. 修改请求方法为POST
调整loadMore方法,让InnerTubeDataFetcher发送POST请求,并携带包含API Key、请求参数的JSON体。
3. 适配JSON响应解析
移除alt=xml参数,修改parse方法处理JSON格式的响应数据。
修改后的代码示例
class com.google.youtube.tv.tree.innertube.InnerTubeNode extends com.google.youtube.tv.tree.ListNode { // 改为具体的API端点,比如search static var URL_BASE = "https://www.googleapis.com/youtubei/v1/search"; function InnerTubeNode(title, loadNow) { super(title, URL_BASE, loadNow); this.setMenuCapturing(true); } // 解析JSON响应 function parse(src) { var jsonData = com.google.youtube.tv.util.JsonUtil.parse(src); // 根据InnerTube API返回结构实现节点创建逻辑 this.createChildrenFromJson(jsonData); } // 从JSON数据创建子节点(需补充业务逻辑) function createChildrenFromJson(jsonData) { var items = jsonData?.items || []; for(var i=0; i<items.length; i++){ var item = items[i]; var childNode = new com.google.youtube.tv.tree.ListNode(item.snippet.title, null, false); this.addChild(childNode); } this.loaded = true; this.notifyChildrenChanged(); } function createChildren() { } // 构建POST请求体 function buildRequestBody() { var requestBody = { key: com.google.youtube.tv.app.Config.API_KEY, // 根据业务需求添加参数,比如搜索关键词、返回字段等 q: "your_search_query", part: "snippet", maxResults: 10 }; return com.google.youtube.tv.util.JsonUtil.stringify(requestBody); } function loadMore() { if(this.loadStarted) { return undefined; } this.loadStarted = true; this.setDataFetcher(); // 配置POST请求参数 this.fetcher.setRequestMethod("POST"); this.fetcher.setRequestBody(this.buildRequestBody()); this.fetcher.fetch(this.getURL()); } function createDataFetcher() { if(this.loaded) { return undefined; } var fetcher = new com.google.youtube.tv.data.InnerTubeDataFetcher(); // 设置请求头为JSON格式 fetcher.addRequestHeader("Content-Type", "application/json"); return fetcher; } }
额外注意事项
- 确保你的API Key已在Google Cloud Console中启用YouTube Data API v3,并配置了正确的权限与访问限制;
- 部分InnerTube接口可能需要OAuth2令牌身份验证,若仅用API Key无法访问,需补充身份验证逻辑;
- 测试时可先用Postman发送POST请求验证API可用性,再移植到代码中。
内容的提问来源于stack exchange,提问作者user21386704
相关产品推荐
相关产品推荐

