Youtube API V3 无法识别 playlistID 过滤器
Youtube API V3 not recognizing playlistID filter
可能是我阅读的 API 文档完全错误,但我们开始吧。
我向 https://www.googleapis.com/youtube/v3/playlistItems 发送了一个 GET 请求。在该请求中,我有 AUTHORIZATION header 和两个参数:
"PART" : "contentDetails",
"PLAYLISTID" : "UUy8_GJ_ZQ2SHm909UJ1AK-Q"
我知道我的授权是正确的,因为我使用相同的授权 header 来毫无问题地获取和接收分析请求。
根据 Google's docs,必须包含 ID 或播放列表 ID。但是当我发送这个请求时,我收到了 "No filter selected" 错误 400。
{ "error" : { "code" : 400,
"errors" : [ { "domain" : "youtube.parameter",
"location" : "",
"locationType" : "parameter",
"message" : "No filter selected.",
"reason" : "missingRequiredParameter"
} ],
"message" : "No filter selected."
}
}
如果我将 PlaylistID 参数更改为 ID,则请求成功完成并且 returns 一个空数组(空数组,因为该视频 ID 显然不存在。)
这是 API 错误吗? API 是否区分大小写? (据我所知,CFHTTP 将参数名称大写,即使我用 LCase 包装它们)
更新:
代码在这里:https://gist.github.com/mborn319/13d7b9b03db10d97cd16
抱歉,我不确定如何最好地共享 200 行 CFML。
正如您所指出的,问题在于大写的 PLAYLIST ID 参数。
{
"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."
}
}
但很抱歉,我无法告诉您如何 post 以小写形式使用 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())#">
可能是我阅读的 API 文档完全错误,但我们开始吧。
我向 https://www.googleapis.com/youtube/v3/playlistItems 发送了一个 GET 请求。在该请求中,我有 AUTHORIZATION header 和两个参数:
"PART" : "contentDetails",
"PLAYLISTID" : "UUy8_GJ_ZQ2SHm909UJ1AK-Q"
我知道我的授权是正确的,因为我使用相同的授权 header 来毫无问题地获取和接收分析请求。
根据 Google's docs,必须包含 ID 或播放列表 ID。但是当我发送这个请求时,我收到了 "No filter selected" 错误 400。
{ "error" : { "code" : 400,
"errors" : [ { "domain" : "youtube.parameter",
"location" : "",
"locationType" : "parameter",
"message" : "No filter selected.",
"reason" : "missingRequiredParameter"
} ],
"message" : "No filter selected."
}
}
如果我将 PlaylistID 参数更改为 ID,则请求成功完成并且 returns 一个空数组(空数组,因为该视频 ID 显然不存在。)
这是 API 错误吗? API 是否区分大小写? (据我所知,CFHTTP 将参数名称大写,即使我用 LCase 包装它们)
更新:
代码在这里:https://gist.github.com/mborn319/13d7b9b03db10d97cd16
抱歉,我不确定如何最好地共享 200 行 CFML。
正如您所指出的,问题在于大写的 PLAYLIST ID 参数。
{
"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."
}
}
但很抱歉,我无法告诉您如何 post 以小写形式使用 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())#">