将所有 URL 组织在类中的一个位置

Organize all URLs in one place inside a class

本文关键字:位置 一个 URL      更新时间:2023-10-16

我在整个类实现中使用HTTP请求的URL:

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_IPm_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)));

注意:这是一个主观问题。解决方案可能会因自己的用例和要求而异。


您可以将 URL 包装为存储在单独头文件中的命名空间中的原始文本字符串(例如urls.hpp(。然后,你可以使用 QString::arg(( 在运行时使用 ip:port 格式化。

下面是一个示例:

#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 的函数可以在内部使用这些 URL,而无需显式参数。