Youtube API V3 无法识别播放列表 ID 过滤器


可能是

我完全错误地阅读了 API 文档,但我们开始了。

我向 https://www.googleapis.com/youtube/v3/playlistItems 发送了一个 GET 请求。在该请求中,我有授权标头和两个参数:

"PART" : "contentDetails",
"PLAYLISTID" : "UUy8_GJ_ZQ2SHm909UJ1AK-Q"

我知道我的授权是正确的,因为我使用相同的身份验证标头来获取和接收分析请求,没有问题。

根据谷歌的文档,必须包含ID或播放列表ID。但是当我发送此请求时,我收到"未选择过滤器"错误 400。

{ "error" : { "code" : 400,
  "errors" : [ { "domain" : "youtube.parameter",
        "location" : "",
        "locationType" : "parameter",
        "message" : "No filter selected.",
        "reason" : "missingRequiredParameter"
      } ],
  "message" : "No filter selected."
   } 
}

如果我将 PlaylistID 参数更改为 ID,则请求成功完成并返回一个空数组(空,因为该视频 ID 显然不存在。

这是一个 API 错误吗?API 是否区分大小写?(据我所知,CFHTTP 将参数名称大写,即使我用 LCase 包装它们)

更新:

此处的代码:https://gist.github.com/mborn319/13d7b9b03db10d97cd16

抱歉,我不确定如何最好地分享 200 行 CFML。

正如您所指出的,问题出在大写的播放列表ID参数上。

如您所见,此请求工作正常:https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&playlistId=UUy8_GJ_ZQ2SHm909UJ1AK-Q&access_token=[putValidAccessTokenHere]

{
    "kind": "youtube#playlistItemListResponse",
    "etag": ""F9iA7pnxqNgrkOutjQAa9F2k8HY/1T4SJss5RstUWWw6S4NPUKDWL-c"",
    "pageInfo": {
        "totalResults": 1,
        "resultsPerPage": 5
    },
    "items": [
        {
            "kind": "youtube#playlistItem",
            "etag": ""F9iA7pnxqNgrkOutjQAa9F2k8HY/s2P7FNuP_oK0sax4SB_fU9BVaLo"",
            "id": "UUeEJED-0K6VNZf3zbi8n5FA7Qu41XY55_",
            "contentDetails": {
                "videoId": "Y-Ft354b_vI"
            }
        }
    ]
}

如果您使用 PLAYLISTID 进行相同的查询,您将获得错误输出:https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&PLAYLISTID=UUy8_GJ_ZQ2SHm909UJ1AK-Q&access_token=[putValidAccessTokenHere]

{
    "error": {
        "errors": [
            {
                "domain": "youtube.parameter",
                "reason": "missingRequiredParameter",
                "message": "No filter selected.",
                "locationType": "parameter",
                "location": ""
            }
        ],
        "code": 400,
        "message": "No filter selected."
    }
}

但是很抱歉,我不能告诉你如何以小写形式发布带有CF的参数(甚至可能吗?),但这里有一些CF代码的参考。他们使用旧的数据 api,但他们通过 get-request 获取数据。在这种情况下,参数的处理方式可能有所不同:http://davidosomething.com/blog/quick-access-to-the-youtube-api-with-coldfusion/

鉴于 API 区分大小写,您必须确保 ColdFusion 保持大小写,这可能有点令人沮丧,因为 ColdFusion 并不严格。

如果使用点表示法指定结构中的键名,CF 几乎总是将其大写。

但是,如果使用括号表示法指定键名称,则会保留大小写。

<cfset args.foo = "...">  key will be stored/transmitted as uppercase FOO
 vs.
<cfset args["foo"] = "...">  key will be stored/transmitted as lowercase foo

<cfset args["UPPERCASE"]="UPPERCASE">
<cfset args["lowercase"]="lowercase">
<cfset args["CamelCase"]="CamelCase">

所以你应该能够使用括号用你的参数创建一个结构

<cfset data["part"] = "contentDetails">
<cfset data["playlistId"] = "UUy8_GJ_ZQ2SHm909UJ1AK-Q">

然后像以前一样循环你的参数

<cfhttp url="#arguments.url#" method="#arguments.type#" result="httpResult">
    <cfloop item="curArg" collection="#data#">
        <cfhttpparam name="#curArg#" value="#data[curArg]#" type="url" />
    </cfloop>
</cfhttp>

然后,API 应在适当的情况下接收参数。

<cfdump var="#DeserializeJson(httpResult.filecontent.tostring())#">

相关内容

  • 没有找到相关文章

最新更新