2017-02-24 2 views
1

Verwenden Sie QOAuth2AuthorizationCodeFlow, um mit googles oauth2 zu autorisieren. Die Autorisierung ist ebenso erfolgreich wie die Verwendung der Anfrage GET (zum Beispiel, um die Liste der Videos vom youtube-Kanal zu erhalten). Aber während QNetworkAccessManager Benutzer mit einem Bündel von post Methode Überlastungen bietet:So laden Sie ein Video mit QNetworkAuth auf Youtube hoch

QNetworkReply * post(const QNetworkRequest &request, QIODevice *data) 
QNetworkReply * post(const QNetworkRequest &request, const QByteArray &data) 
QNetworkReply * post(const QNetworkRequest &request, QHttpMultiPart *multiPart) 

QOAuth2AuthorizationCodeFlow hat nur:

QNetworkReply *post(const QUrl &url, const QVariantMap &parameters = QVariantMap()); 

Es ist einfach eine Datei mit QHttpMultiPart & QHttpPart::setBodyDevice() anhängen. Aber ich bin mir nicht sicher, wie man QVariantMap für Video/Datei-Upload verwendet.

Auch versucht, zu verwenden: QOAuth2AuthorizationCodeFlow::networkAccessManager() Zugriff auf zugrunde liegenden Netzwerk-Manager erhalten, aber es gibt 202 Antwortcode mit GET. Und wenn Sie mit der authentifizierten URL QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl() verwenden, lautet der Antwortcode 200, aber der Inhalt der Antwort ist leer (readAll() gibt den leeren Puffer zurück). Funktioniert auch nicht mit POST.

Mit QT 2. Tag, so kann ich einige Konzepte missverstehen. Danke für jede Hilfe & Ideen.

+0

Glücklich, dass jemand diese Frage gestellt hat. – Akiva

+0

Nur neugierig, ob es Ihnen etwas ausmachen würde, den vollständigen Code dafür zur Verfügung zu stellen. Ich werde im Gegenzug einen Ruf als Dank verschenken. Ich habe ein bisschen Probleme damit, weil die Dokumentation fehlt. – Akiva

+1

@Akiva der Code ist nicht so schön, aber es hochgeladen ein Video für mich https://github.com/x4t3a/YoutubeUploader/blob/master/youtube_wrapper.cpp#L98 –

Antwort

1

War in der Lage, es zu umgehen. Aber trotzdem, vielleicht gibt es die richtige Lösung dafür.

QOAuth2AuthorizationCodeFlow youtube{}; 
... 
// authorization 
... 
auto multi_part = new QHttpMultiPart{ QHttpMultiPart::MixedType }; 
auto video_part = new QHttpPart{}; 
auto video = new QFile{ video_path }; 

if (!video->open(QIODevice::ReadOnly)) { return nullptr; } 

video_part->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("video/*")); 
video_part->setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("Slug")); 
video_part->setBodyDevice(video); 
multi_part->append(*video_part); 

QNetworkRequest req{youtube_videos_insert}; 
const QString bearer_format = QStringLiteral("Bearer %1"); 
const QString bearer = bearer_format.arg(youtube.token()); 
req.setRawHeader("Authorization", bearer.toUtf8()); 

youtube.networkAccessManager()->post(req, multi_part); 
Verwandte Themen