#go #youtube-data-api #thumbnails
#Вперед #youtube-data-api #миниатюры
Вопрос:
Я пытаюсь загрузить миниатюру для видео YouTube таким образом:
import (
"bufio"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
func main() {
url := "https://www.googleapis.com/youtube/v3/thumbnails/set?videoId=kU7okI-_vvUamp;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 требует, чтобы максимальный размер файла составлял 2 МБ, и я позаботился об этом.
Спасибо.
PS: Хотя в коде это не показано, результат проверяется с обработкой ошибок.
Комментарии:
1. Пожалуйста, не игнорируйте ошибки.
2. @Marc Хотя в коде это не показано, результат проверяется с обработкой ошибок. Я просто опустил здесь, чтобы сохранить четкость кода.
3. Предполагая, что вы правильно проверили все ошибки (именно поэтому лучше поместить это в код), попробуйте установить для
Content-Type
заголовка значениеimage/png
.4. @Marc Спасибо за предложение. Но не повезло! Он по-прежнему выдает ту же ошибку.
Ответ №1:
Использование простых HTTP-методов для вызова YouTube Data API иногда может быть довольно сложным.
Вместо этого вы должны были использовать клиентскую библиотеку Google API для Go. Смотрите также официальный Быстрый старт Go.
В случае, если вы придерживаетесь своего текущего кода, вам необходимо иметь следующее:
- вызывающий URL-адрес должен содержать параметр
uploadType=media
, и Content-Type
заголовок должен быть передан HTTP-вызову со значением kindimage/png
(как уже предлагалось выше).Content-Length
заголовок также должен быть задан вашим кодом (поскольку это не делается внутриNewRequestWithContext
функции; смотрите также документ этой функции, как указано @Peter ниже).
Также вам необходимо изменить свой URL-адрес, поскольку, согласно официальному документу, URL конечной точки API является:
https://www.googleapis.com/upload/youtube/v3/thumbnails/set
.
Обратите внимание, что в вашем URL-адресе отсутствует /upload/
компонент path.
Комментарии:
1. Длина содержимого определяется только из * байт. Буфер, * байт. Считыватель или * строки. Читатель. golang.org/pkg/net/http/#NewRequestWithContext (последний абзац)
2. Пожалуйста, попробуйте также настроить
Content-Length
.3. Параметр
uploadType=media
является обязательным, даже если он не задокументирован; его можно найти в исходном коде клиентских библиотек.4. Смотрите реализацию этой конечной точки API в youtube / v3 / youtube-gen.go