#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. Да, пожалуйста, добавьте текст, и ваш запрос должен быть успешным