Youtube Api playlistItems вставляет ошибку Flutter

#flutter #insert #youtube-api

Вопрос:

Проблема в том, что сервер говорит, что 401 не авторизован. Кто — нибудь знает, как я пишу функцию, которая вставляет видео в плейлист?

     final String apiUrl = "https://youtube.googleapis.com/youtube/v3/playlistItems?key="  
        ApiKey.API_KEY;

      final GoogleSignInAccount googleUser = await GoogleSignIn().signInSilently();
      final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
      final credential = GoogleAuthProvider.getCredential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.serverAuthCode,
      );
      print("token  " googleAuth.idToken);


    final response = await http.post(apiUrl, headers: {
      "Authorization": "Bearer"  googleAuth.idToken,
      "Accept": "application/json",

    },
    );
    if (response.statusCode == 200){
      print("Song was added to playlist");
    }
    else{
      print(response.statusCode);
      print("Failture song wasn't added to playlist");
    }
  }
 

Это то, что сработало для меня в окне тестирования YouTube-Api

 
POST https://youtube.googleapis.com/youtube/v3/playlistItems?part=snippetamp;key=[YOUR_API_KEY] HTTP/1.1

Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json
Content-Type: application/json

{
  "snippet": {
    "playlistId": "PLu55WjdIfjnZznsIY0waSdBFMdmle9Xu2",
    "position": 0,
    "resourceId": {
      "kind": "youtube#video",
      "videoId": "M7FIvfx5J10"
    }
  }
}
 

Но теперь моя проблема в том, как преобразовать это в рабочую функцию

Ошибка, которая отображается

 E/flutter ( 8397): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type '_InternalLinkedHashMap<String, Object>' is not a subtype of type 'String' in type cast
E/flutter ( 8397): #0      CastMap.forEach.<anonymous closure> (dart:_internal/cast.dart:288:25)
E/flutter ( 8397): #1      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
E/flutter ( 8397): #2      CastMap.forEach (dart:_internal/cast.dart:287:13)
E/flutter ( 8397): #3      mapToQuery (package:http/src/utils.dart:17:7)
E/flutter ( 8397): #4      Request.bodyFields= (package:http/src/request.dart:137:12)
E/flutter ( 8397): #5      BaseClient._sendUnstreamed (package:http/src/base_client.dart:85:17)
E/flutter ( 8397): #6      BaseClient.post (package:http/src/base_client.dart:32:7)
E/flutter ( 8397): #7      post.<anonymous closure> (package:http/http.dart:70:16)
E/flutter ( 8397): #8      _withClient (package:http/http.dart:166:20)
E/flutter ( 8397): #9      post (package:http/http.dart:69:5)
E/flutter ( 8397): #10     AdminAddRequestToPlaylist.addVideoToPlaylist (package:flutter_app/screens/admin/conponents/AdminAddRequestsToPlaylist.dart:125:28)
E/flutter ( 8397): <asynchronous suspension>
E/flutter ( 8397): 
 

Комментарии:

1. Для вставки элемента видео в список воспроизведения требуется, чтобы вы прошли надлежащую аутентификацию/авторизацию . Ключ API ни в коем случае не будет работать с этой конечной точкой API.

2. Хорошо пытался справиться с этим, но всегда 401. Даже с помощью Oauth. Может быть, у вас есть фрагмент кода?

3. Посмотрите на этот официальный пример кода Java: PlaylistUpdates.java и Auth.java .

4. тх, но у тебя нет примера с дротиком, верно? Я не лучший в преобразовании кода между разными языками

5. Вы используете google для входа, который является open id, и вам нужна авторизация, а не аутентификация. вам нужно добавить к этому одну из областей YouTube, иначе у вас не будет доступа.

Ответ №1:

Вам нужно использовать an accessToken , а не an idToken . Попробуйте код ниже

 addPlayListItem() async {
    final String apiUrl = "https://www.googleapis.com/youtube/v3/playlistItems";

    final GoogleSignInAccount googleUser = await GoogleSignIn()
        .signInSilently();
    final GoogleSignInAuthentication googleAuth = await googleUser
        .authentication;
    final credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.serverAuthCode,
    );
    print("token  "   googleAuth.accessToken); // accessToken not idToken


    final response = await http.post(
      apiUrl,
      headers: {
      "Authorization": "Bearer ${googleAuth.accessToken}", // Use access token and add a space after the 'Bearer
      "Accept": "application/json",
      },
      body: jsonEncode({
        "playlistId": "PLu55WjdIfjnZznsIY0waSdBFMdmle9Xu2",
        "position": 0,
        "resourceId": {
          "kind": "youtube#video",
          "videoId": "M7FIvfx5J10"
        }
      }),
    );
    if (response.statusCode == 200) {
      print("Song was added to playlist");
    }
    else {
      print(response.statusCode);
      print("Failture song wasn't added to playlist");
    }
  }
 

Комментарии:

1. спасибо, теперь мы переехали с 401-го на 403-й

2. Может быть, это из-за пропавшего тела, потому что, если я найду тело, оно разобьется

3. Да, пожалуйста, добавьте текст, и ваш запрос должен быть успешным