#pragma once //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // упрощенный разбор запроса URI — Universal Resource Identifier — универсальный идентификатор ресурса. // я добавил для завершения разбора args ';' потому, что после # строка обрезается // #include "CppCommon/Common/Basic/JDefines.h" #include "CppCommon/Common/Basic/JTerminal.h" #include namespace Incart::Net::WebApi { class ParsingURI { const bool MYDEBUG = false; protected: QString m_uri; QString m_path; QString m_fname; QString m_ext; QString m_settings; QList m_commands; QMap m_args; QVariantMap m_argsV; QList m_anchors; QString m_nu; public: ParsingURI() { Common::JT() << __PRETTY_FUNCTION__; } virtual ~ParsingURI() { Common::JT() << __PRETTY_FUNCTION__; } void test1() { QString uri = "/path1/path2/path3.ext?argument1=value1&argument2=value2&argument3=value3#anchor1&anchor2&anchor3"; exe(uri); } void test2() { QString uri = "/path1#anchor1&anchor2&anchor3"; exe(uri); } void test3() { QString uri = "#anchor1&anchor2&anchor3"; exe(uri); } void test4() { QString uri = "?argument1=value1&argument2=value2&argument3=value3"; exe(uri); } void clear() { m_path.clear(); m_fname.clear(); m_ext.clear(); m_commands.clear(); m_args.clear(); m_args.clear(); m_anchors.clear(); m_settings.clear(); } #ifdef QT_VERSION_6_OR_HIGHER int delimiter(QChar& ch) #else int delimiter(QCharRef ch) #endif { if(ch =='/') return 1; else if(ch=='?') return 2; else if((ch=='#') || (ch==';')) return 3; return -1; } void exe(QString uri) { m_uri = uri; clear(); #ifdef OLD_QT_VERSION QStringList lst = m_uri.split("?", QString::SkipEmptyParts); #else QStringList lst = m_uri.split("?", Qt::SkipEmptyParts); #endif QString strs[4]; int state = 0; for(int i = 0; i state) state = st; else strs[state].append(m_uri[i]); break; } case 1: { // path int st = delimiter(m_uri[i]); if(st > state) state = st; else strs[state].append(m_uri[i]); break; } case 2: { // args int st = delimiter(m_uri[i]); if(st > state) state = st; else strs[state].append(m_uri[i]); break; } case 3: { // anchor strs[state].append(m_uri[i]); break; } default: { // ошибка return; } } } m_path = strs[1]; Commands(strs[1]); Extension(strs[1]); Args(strs[2]); Anchors(strs[3]); m_settings = strs[2] + strs[3]; //for(int st = 0; st < 4; st++) JTerminal() << strs[st]; } QString& getURI() { return m_uri; } QString& getPath() { return m_path; } QString& getFname() { return m_fname; } QString& getExtension() { return m_ext; } QString& getSettings() { return m_settings; } QMap& getArgs() { return m_args; } // вариант 1 QVariantMap& getArgsV() { return m_argsV; } // вариант 2 QList& getAnchors() { return m_anchors; } QList& getCommands() { return m_commands; } QString& getCommand() { if(m_commands.size() > 0) return m_commands[0]; else return(m_nu); } protected: void Commands(QString str) { m_commands = str.split("/"); m_fname = str.remove(0,m_commands[0].size()+1); } void Extension(QString str) { m_ext.clear(); QStringList list = str.split("."); if(list.size()>1) { m_ext = list[list.size()-1]; } } void Args(QString args) { m_args.clear(); m_argsV.clear(); QString str; for(int i = 0; i