Qt小例子学习91 - 获取网络令牌
SpotifyWrapper.h
#include "spotifywrapper.h"
#include "networkaccessmanager.h"
#include "constants.h"#include <QDesktopServices>
#include <QOAuthHttpServerReplyHandler>
#include <QUrlQuery>SpotifyWrapper::SpotifyWrapper(QObject *parent) : QObject(parent)
{QOAuthHttpServerReplyHandler * replyHandler = new QOAuthHttpServerReplyHandler(1337, this);replyHandler->setCallbackPath("callback");oauth2.setNetworkAccessManager(new NetworkAccessManager(this));oauth2.setReplyHandler(replyHandler);oauth2.setAuthorizationUrl(Constants::SPOTIFY_AUTHORIZATION_URL);oauth2.setAccessTokenUrl(Constants::SPOTIFY_ACCESSTOKEN_URL);oauth2.setClientIdentifier(Constants::SPOTIFY_CLIENT_ID);oauth2.setScope("user-read-private user-read-email");oauth2.setState("34fFs29kd09");connect(&oauth2, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser,&QDesktopServices::openUrl);connect(&oauth2, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](QAbstractOAuth::Status status) {if (status == QAbstractOAuth::Status::Granted){emit authenticated();}});
}void SpotifyWrapper::grant()
{oauth2.grant();
}QNetworkReply *SpotifyWrapper::me()
{return oauth2.get(QUrl("https://api.spotify.com/v1/me"));
}
SpotifyWrapper.cpp
#include "spotifywrapper.h"
#include "networkaccessmanager.h"
#include "constants.h"#include <QDesktopServices>
#include <QOAuthHttpServerReplyHandler>
#include <QUrlQuery>SpotifyWrapper::SpotifyWrapper(QObject *parent) : QObject(parent)
{QOAuthHttpServerReplyHandler * replyHandler = new QOAuthHttpServerReplyHandler(1337, this);replyHandler->setCallbackPath("callback");oauth2.setNetworkAccessManager(new NetworkAccessManager(this));oauth2.setReplyHandler(replyHandler);oauth2.setAuthorizationUrl(Constants::SPOTIFY_AUTHORIZATION_URL);oauth2.setAccessTokenUrl(Constants::SPOTIFY_ACCESSTOKEN_URL);oauth2.setClientIdentifier(Constants::SPOTIFY_CLIENT_ID);oauth2.setScope("user-read-private user-read-email");oauth2.setState("34fFs29kd09");connect(&oauth2, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser,&QDesktopServices::openUrl);connect(&oauth2, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](QAbstractOAuth::Status status) {if (status == QAbstractOAuth::Status::Granted){emit authenticated();}});
}void SpotifyWrapper::grant()
{oauth2.grant();
}QNetworkReply *SpotifyWrapper::me()
{return oauth2.get(QUrl("https://api.spotify.com/v1/me"));
}
NetworkAccessManager.h
#ifndef NETWORKACCESSMANAGER_H
#define NETWORKACCESSMANAGER_H#include <QNetworkAccessManager>class NetworkAccessManager : public QNetworkAccessManager
{
public:using QNetworkAccessManager::QNetworkAccessManager;
protected:QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData);
};#endif // NETWORKACCESSMANAGER_H
NetworkAccessManager.cpp
#include "networkaccessmanager.h"
#include "constants.h"
#include <QtGlobal>QNetworkReply *NetworkAccessManager::createRequest(QNetworkAccessManager::Operation op,const QNetworkRequest &request,QIODevice *outgoingData)
{QNetworkRequest r(request);if(r.url() == Constants::SPOTIFY_ACCESSTOKEN_URL)r.setRawHeader("Authorization","Basic " +QByteArray(Constants::SPOTIFY_CLIENT_ID + ":" + Constants::SPOTIFY_CLIENT_SECRET).toBase64());return QNetworkAccessManager::createRequest(op, r, outgoingData);
}
Constants.h
#ifndef CONSTANTS_H
#define CONSTANTS_H#include <QByteArray>
#include <QUrl>namespace Constants {const QByteArray SPOTIFY_CLIENT_ID = "client-id";const QByteArray SPOTIFY_CLIENT_SECRET = "client-secret";const QUrl SPOTIFY_AUTHORIZATION_URL = QUrl("https://accounts.spotify.com/authorize");const QUrl SPOTIFY_ACCESSTOKEN_URL = QUrl("https://accounts.spotify.com/api/token");
}#endif // CONSTANTS_H
main.cpp
#include "spotifywrapper.h"#include <QNetworkReply>
#include <QGuiApplication>
#include <QTimer>int main(int argc, char *argv[])
{QGuiApplication a(argc, argv);SpotifyWrapper wrapper;wrapper.grant();QObject::connect(&wrapper, &SpotifyWrapper::authenticated, [&wrapper](){qDebug() << "authenticated";QNetworkReply *reply = wrapper.me();QObject::connect(reply, &QNetworkReply::finished, [=]() {reply->deleteLater();if (reply->error() != QNetworkReply::NoError) {qDebug() << reply->errorString();return;}qDebug() << reply->readAll();QTimer::singleShot(1000, &QCoreApplication::quit);});});return a.exec();
}