Youtube 缩略图上传失败 API
Youtube Thumbnail upload Failing with API
我正在尝试以这种方式上传 YouTube 视频的缩略图:
import (
"bufio"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
func main() {
url := "https://www.googleapis.com/youtube/v3/thumbnails/set?videoId=kU7okI-_vvU&key=[API_KEY]Type=media"
imageRef, err := os.Open("test.png")
if err != nil {
log.Fatal("os.Open", err)
}
rd := bufio.NewReader(imageRef)
req, err := http.NewRequest("POST", url, rd)
if err != nil {
log.Fatal("http.NewRequest", err)
}
log.Println(req.Body)
req.Header.Add("authorization", "Bearer [ACCESS_TOKEN]")
req.Header.Add("content-type", "image/png")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal("http.DefaultClient", err)
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal("ioutil.ReadAll", err)
}
fmt.Println(res)
fmt.Println(string(body))
}
我收到这样的回复:
"error": {
"code": 400,
"message": "The request does not include the image content.",
"errors": [
{
"message": "The request does not include the image content.",
"domain": "youtube.thumbnail",
"reason": "mediaBodyRequired",
"location": "body",
"locationType": "other"
}
]
}
}
我在 POST 请求中包含图像正文。然而响应显示 “请求不包含图像内容。”。谁能帮忙解决这个问题。
API 要求最大文件大小为 2MB,我已确保这一点。
谢谢。
PS:虽然没有在代码中显示,但结果是通过错误处理进行测试的。
使用纯 HTTP 方法调用 YouTube 数据 API 有时会非常棘手。
你应该一直在使用 Google API Client Library for Go instead. See also the official Go Quickstart。
如果您坚持使用当前代码,则需要具备以下条件:
- 调用URL应该包含参数
uploadType=media
,并且
- 应该将
Content-Type
header 传递给具有种类 image/png
值的 HTTP 调用(如上所述)。
Content-Length
header 也应该由您的代码设置(因为这不是在 NewRequestWithContext
function; see also this function's doc 中完成的,如下 @Peter 所示)。
您还必须更改 URL,因为根据 official doc,API 端点的 URL 是:
https://www.googleapis.com/upload/youtube/v3/thumbnails/set
.
请注意您的 URL 缺少 /upload/
路径组件。
我正在尝试以这种方式上传 YouTube 视频的缩略图:
import (
"bufio"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
func main() {
url := "https://www.googleapis.com/youtube/v3/thumbnails/set?videoId=kU7okI-_vvU&key=[API_KEY]Type=media"
imageRef, err := os.Open("test.png")
if err != nil {
log.Fatal("os.Open", err)
}
rd := bufio.NewReader(imageRef)
req, err := http.NewRequest("POST", url, rd)
if err != nil {
log.Fatal("http.NewRequest", err)
}
log.Println(req.Body)
req.Header.Add("authorization", "Bearer [ACCESS_TOKEN]")
req.Header.Add("content-type", "image/png")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal("http.DefaultClient", err)
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal("ioutil.ReadAll", err)
}
fmt.Println(res)
fmt.Println(string(body))
}
我收到这样的回复:
"error": {
"code": 400,
"message": "The request does not include the image content.",
"errors": [
{
"message": "The request does not include the image content.",
"domain": "youtube.thumbnail",
"reason": "mediaBodyRequired",
"location": "body",
"locationType": "other"
}
]
}
}
我在 POST 请求中包含图像正文。然而响应显示 “请求不包含图像内容。”。谁能帮忙解决这个问题。
API 要求最大文件大小为 2MB,我已确保这一点。
谢谢。
PS:虽然没有在代码中显示,但结果是通过错误处理进行测试的。
使用纯 HTTP 方法调用 YouTube 数据 API 有时会非常棘手。
你应该一直在使用 Google API Client Library for Go instead. See also the official Go Quickstart。
如果您坚持使用当前代码,则需要具备以下条件:
- 调用URL应该包含参数
uploadType=media
,并且 - 应该将
Content-Type
header 传递给具有种类image/png
值的 HTTP 调用(如上所述)。 Content-Length
header 也应该由您的代码设置(因为这不是在NewRequestWithContext
function; see also this function's doc 中完成的,如下 @Peter 所示)。
您还必须更改 URL,因为根据 official doc,API 端点的 URL 是:
https://www.googleapis.com/upload/youtube/v3/thumbnails/set
.
请注意您的 URL 缺少 /upload/
路径组件。