Можно ли упростить формирование url'a?

96
01 января 2022, 11:30

При запросе к ресурсу, необходимо настраивать запрос, т.е. формировать правильный url, оставлять пустые параметры нельзя, т.е. к примеру есть некоторые необязательные параметры, и если они не нужно, они не должны присутствовать в запросе.

Я написал структуру настроек, которая формирует QString на основе данных которые в ней содержатся:

#include <QString>
#include <QtGlobal>
#include <QVariant>
#include <QUrl>
typedef struct kodik_settings_t
{
    typedef enum class sort_type_t
    {
        year    = 0x00000000,
        create  = 0x00000001,
        update  = 0x00000002
    } sort_type_t;
    typedef enum class order_by_t
    {
        ask     = 0x00000000,
        desk    = 0x00000001
    } order_by_t;
    quint8      limit;
    sort_type_t sort_by;
    order_by_t  order_by;
    quint32     year;
    qint64      translation_id;
    QVariant    cam_rip;
    QVariant    not_blocked_for_me;
    QString make_url() const;
    kodik_settings_t();
protected:
    bool        with_episodes_;
    bool        with_page_links_;
    bool        with_material_data_;
private:
    const QString   url_make_;
} kodik_settings_t;
kodik_settings_t::kodik_settings_t() :
    limit(100),
    sort_by(sort_type_t::update),
    order_by(order_by_t::ask),
    year(0u),
    translation_id(INT64_MIN),
    cam_rip(),
    not_blocked_for_me(),
    with_episodes_(true),
    with_page_links_(true),
    with_material_data_(true),
    url_make_("%1%2%3%4%5%6%7%8&type=anime-serial")
{
}
QString kodik_settings_t::make_url() const
{
    QString limit_data = QString("&limit=%1")
            .arg(limit);
    QString sort_by_data = QString("&sort=%1");
    QString order_by_data = QString("&order_by=%1")
            .arg(order_by == order_by_t::ask ? "ask" : "desk");
    QString year_data = year == 0 ? "" : QString("&year=%1").arg(year);
    QString translation_id_data =
            translation_id == INT64_MIN
            ? ""
            : QString("&translation_id=%1")
              .arg(translation_id);
    QString cam_rip_data =
            cam_rip.isNull()
            ? ""
            : QString("&camrip=%1")
              .arg(cam_rip.toBool() ? "true" : "false");
    QString not_blocked_for_me_data =
            not_blocked_for_me.isNull()
            ? ""
            : QString("&not_blocked_for_me=%1")
              .arg(not_blocked_for_me.toBool() ? "true" : "false");
    QString const_data = QString("&with_episodes=%1&with_page_links=%2&with_material_data=%3")
            .arg(with_episodes_ ? "true" : "false", with_page_links_ ? "true" : "false", with_material_data_ ? "true" : "false");
    switch (sort_by)
    {
    case sort_type_t::year:
        sort_by_data = sort_by_data.arg("year");
        break;
    case sort_type_t::create:
        sort_by_data = sort_by_data.arg("create");
        break;
    case sort_type_t::update:
        sort_by_data = sort_by_data.arg("update");
        break;
    }
    return url_make_
            .arg
            (
                limit_data,
                sort_by_data,
                order_by_data,
                year_data,
                translation_id_data,
                cam_rip_data,
                not_blocked_for_me_data,
                const_data
            );
}

Но мне кажется что метод make_url может быть проще чем сейчас. Т.е. без нагромождения arg...arg...arg..., но увы я не знаю точно это или нет.

Можно ли как-то упростить формирование строки запроса?

READ ALSO
Поиск пути в матрице с++

Поиск пути в матрице с++

Всем привет :)

184
О моделях памяти в spinlock mutex

О моделях памяти в spinlock mutex

В книге "Параллельное программирование на С++ в действии" приводится пример спинлока

178
Синхронная прокрутка нескольких listbox winforms c#

Синхронная прокрутка нескольких listbox winforms c#

Есть 4 листбокса в winforms, количество айтемов там всегда одинаковое, как сделать синхронную прокрутку с клавиатуры(стрелок), колесика мышки...

156