Сбой загрузки миниатюр Youtube с помощью API

#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-вызову со значением kind image/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