Организуйте все URL в одном месте внутри класса - PullRequest
0 голосов
/ 02 февраля 2020

Я использую URL-адреса для HTTP-запросов по всей реализации класса:

QNetworkRequest m_request;

m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/details"));
request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/sli"));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/sli/preview"));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/sli/send"));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/sli/download"));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/advanced-sli"));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/profiles/" + ip + ":" + port));
m_request.setUrl(QUrl("http://" + m_IP + ":" + m_Port + "/terminate"));

Как мне организовать все мои URL-адреса в одном месте для удобства и простоты доступа?


Один из вариантов - использовать static const, как это, поверх исходного файла реализации класса:

static const QUrl url1 = QUrl("http://" + m_IP + ":" + m_Port + "/details");
static const QUrl url2 = QUrl("http://" + m_IP + ":" + m_Port + "/terminate");
static const QUrl url3 = QUrl("http://" + m_IP + ":" + m_Port + "/advanced-sli");

// ...

m_request.setUrl(url1);
m_request.setUrl(url2);
m_request.setUrl(url3);

// ...

Но проблема в том, что я не могу получить доступ к членам m_IP и m_Port внутри моего static const определения.

ОБНОВЛЕНИЕ: решение

Наконец, я реализовал это поверх реализации класса:

static const QString routeDetails     = "http://%1:%2/details" ;
static const QString routeSli         = "http://%1:%2/sli" ;
static const QString routeSliPreview  = "http://%1:%2/sli/preview" ;
static const QString routeSliSend     = "http://%1:%2/sli/send" ;
static const QString routeSliDownload = "http://%1:%2/sli/download" ;
static const QString routeAdvancedSli = "http://%1:%2/advanced-sli" ;
static const QString routeProfiles    = "http://%1:%2/profiles/%3:%4" ;
static const QString routeTerminate   = "http://%1:%2/terminate" ;

И на протяжении всей реализации у меня есть такие утверждения:

m_request.setUrl(QUrl(routeDetails.arg(m_IP).arg(m_Port)));
request.setUrl(QUrl(routeSli.arg(m_IP).arg(m_Port)));
m_request.setUrl(QUrl(routeSliPreview.arg(m_IP).arg(m_Port)));
m_request.setUrl(QUrl(routeSliSend.arg(m_IP).arg(m_Port)));
m_request.setUrl(QUrl(routeSliDownload.arg(m_IP).arg(m_Port)));
m_request.setUrl(QUrl(routeAdvancedSli.arg(m_IP).arg(m_Port)));
m_request.setUrl(QUrl(routeProfiles.arg(m_IP).arg(m_Port).arg(ip).arg(port)));
m_request.setUrl(QUrl(routeTerminate.arg(m_IP).arg(m_Port)));

1 Ответ

3 голосов
/ 02 февраля 2020

ПРИМЕЧАНИЕ : Это субъективная проблема. Решение может отличаться в зависимости от собственного варианта использования и требований.


Вы можете заключить URL-адреса в виде необработанных литеральных строк в пространстве имен, хранящемся в отдельном заголовочном файле (например, urls.hpp). И, затем, вы можете использовать QString :: arg () для форматирования во время выполнения с портом ip: всякий раз, когда это необходимо.

Вот пример:

#include <QDebug>
#include <QString>
#include <QUrl>

namespace url {

static constexpr auto default_ip    = "localhost";
static constexpr auto default_port  = "8080";

static constexpr auto about         = "about";
static constexpr auto services      = "services";
static constexpr auto products      = "products";

QUrl fmt( const QString& route, const QString& ip = default_ip, const QString& port = default_port ) noexcept
{
    static const auto fmt = QString{ "http://%1:%2/%3" };
    return fmt.arg(ip).arg(port).arg(route);
}

} // url

int main()
{
    constexpr auto ip   = "192.168.123.123";
    constexpr auto port = "9090";

    const auto about    = url::fmt( url::about );
    const auto services = url::fmt( url::services );
    const auto products = url::fmt( url::products, ip, port );

    qDebug() << about;
    qDebug() << services;
    qDebug() << products;

    return 0;
}

Вывод :

QUrl("http://localhost:8080/about")
QUrl("http://localhost:8080/services")
QUrl("http://192.168.123.123:9090/products")

Вы можете избежать передачи ip: port каждый раз, сначала сохраняя их, если значения по умолчанию не требуются. Функция, которая возвращает форматированный URL, может использовать их внутри без необходимости явных аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...