Evgenii Legotckoi
Evgenii LegotckoiМамыр 4, 2017, 11:33 Т.Ж.

Qt/C++ - 065-сабақ. QNetworkAccessManager жүйесінде HTTP қателерін серверлік жауап қателеріне салыстыру

Сабақтардың бірінде QNetworkAccessManager арқылы http. хаттамасы арқылы сайттан бет мазмұнын алу жұмысы ұсынылды. Тексеру болды. қателер үшін, бірақ қателердің қандай болуы мүмкін екендігі туралы ешқандай түсініктеме берілген жоқ. Бұл әрекетті орындау үшін QNetworkReply сыныбы ықтимал қате кодтарын тізімдейтін enum NetworkError береді.

Сәтті болса, NoError 0 мәніне тең қайтарылады.

Әйтпесе, төмендегі кодтардан қате коды қайтарылады:


тұрақты Мағынасы Сипаттама
QNetworkReply::ConnectionRefusedError
1
Қашықтағы сервер қосылымнан бас тартты (сервер сұрауларды қабылдамайды)
QNetworkReply::RemoteHostClosedError
2
қашықтағы сервер барлық жауап қабылданып, өңделмей тұрып қосылымды мерзімінен бұрын жапты
QNetworkReply::HostNotFoundError
3
қашықтағы хост табылмады (жарамсыз хост атауы)
QNetworkReply::TimeoutError
4
қашықтағы серверге қосылу мерзімі аяқталды
QNetworkReply::OperationCanceledError
5
операция аяқталмай тұрып abort() немесе close() шақыру арқылы тоқтатылды.
QNetworkReply::SslHandshakeFailedError
6
SSL/TLS қосылымы сәтсіз аяқталды, шифрланған арна мүмкін емес. sslErrors() сигналы шығарылуы керек.
QNetworkReply::TemporaryNetworkFailureError
7
Желіден ажыратылғандықтан қосылым үзілді, бірақ жүйе басқа кіру нүктесіне роумингті бастады. Сұрау қайталануы керек және қосылым қалпына келтірілгеннен кейін өңделеді.
QNetworkReply::NetworkSessionFailedError
8
Байланыс желіден ажыратылғандықтан немесе желіні іске қосу мүмкін болмағандықтан үзілді.
QNetworkReply::BackgroundRequestNotAllowedError
9
платформа саясатына байланысты сұрауға қазір рұқсат етілмейді.
QNetworkReply::TooManyRedirectsError
10
қайта бағыттаулар саны рұқсат етілген шектен асып кетті. Әдепкі шектеу QNetworkRequest::setMaxRedirectsAllowed() арқылы 50 қайта бағыттауға орнатылған.
QNetworkReply::InsecureRedirectError
11
қайта бағыттауларды өңдеу кезінде вебке кіру API шифрланған (https) және шифрланбаған (http) бағытына қайта бағыттауды анықтады
QNetworkReply::ProxyConnectionRefusedError
101
прокси серверге қосылуға тыйым салынды (прокси сервер сұрауларды қабылдамайды)
QNetworkReply::ProxyConnectionClosedError
102
прокси бүкіл жауап қабылданып, өңделмес бұрын қосылымды мерзімінен бұрын жапты
QNetworkReply::ProxyNotFoundError
103
прокси-хост табылмады (жарамсыз прокси-хост атауы)
QNetworkReply::ProxyTimeoutError
104
прокси серверге қосылу мерзімі аяқталды немесе прокси сервер жіберілген сұрауға уақытында жауап бермеді
QNetworkReply::ProxyAuthenticationRequiredError
105
прокси сұрауды орындау үшін аутентификацияны талап етеді, бірақ ұсынылған тіркелгі деректерін қабылдамады (бар болса)
QNetworkReply::ContentAccessDenied
201
қашықтағы мазмұнға кіруге тыйым салынды (HTTP 401 қатесіне ұқсас)
QNetworkReply::ContentOperationNotPermittedError
202
Қашықтағы мазмұнда сұралған әрекетке рұқсат етілмейді
QNetworkReply::ContentNotFoundError
203
серверде қашықтағы мазмұн табылмады (HTTP 404 қатесіне ұқсас)
QNetworkReply::AuthenticationRequiredError
204
қашықтағы сервер мазмұнды қамтамасыз ету үшін аутентификацияны қажет етеді, бірақ берілген тіркелгі деректері қабылданбады (бар болса)
QNetworkReply::ContentReSendError
205
сұрауды қайта жіберу керек, бірақ ол, мысалы, деректерді жүктеуді екінші рет оқу мүмкін болмағандықтан, сәтсіз аяқталды.
QNetworkReply::ContentConflictError
206
ресурстың ағымдағы күйімен қайшылыққа байланысты сұрауды аяқтау мүмкін болмады.
QNetworkReply::ContentGoneError
207
Сұралған ресурс серверде енді қолжетімді емес.
QNetworkReply::InternalServerError
401
Сервер сұрауды орындауға кедергі келтіретін күтпеген жағдайға тап болды.
QNetworkReply::OperationNotImplementedError
402
сервер сұрауды аяқтау үшін қажетті функцияны қолдамайды.
QNetworkReply::ServiceUnavailableError
403
сервер қазіргі уақытта сұрауды өңдей алмайды.
QNetworkReply::ProtocolUnknownError
301
Network Access API сұрауды қанағаттандыра алмайды, себебі протокол белгісіз
QNetworkReply::ProtocolInvalidOperationError
302
сұралған операцияға осы протокол үшін рұқсат етілмейді
QNetworkReply::Белгісіз желі қатесі
99
белгісіз желі қатесі анықталды
QNetworkReply::UnknownProxyError
199
белгісіз прокси қатесі анықталды
QNetworkReply::Белгісіз мазмұн қатесі
299
жойылған мазмұнға қатысты белгісіз қате
QNetworkReply::ProtocolFailure
399
хаттама қатесі анықталды (талдау қатесі, жарамсыз немесе күтпеген жауаптар және т.б.)
QNetworkReply::UnknownServerError
499
сервер жауабына қатысты белгісіз қате орын алды

Қателердің осы тізімін зерттегеннен кейін, бұл тізім, мысалы, http сервері қайтара алатын қате кодтарының тізіміне қарағанда, қателердің әлдеқайда үлкен тізімін біріктіреді деген қорытындыға келе аламыз. Мүмкін болатын қателер және олар не тудыруы мүмкін туралы аздап сөйлесейік.

QNetworkReply::ConnectionRefusedError және QNetworkReply::RemoteHostClosedError

Егер біз осы қателерді түсіндіру туралы айтатын болсақ, онда мен үшін ең жарқын мысал - SSH арқылы басқа хостқа қосылу. Қателердің мәні мынада: бірінші жағдайда сервер бізді кіргізбейді, ал екінші жағдайда белгілі бір уақыттан кейін байланыс жабылуы мүмкін.

Сондай-ақ, ConnectionRefusedError қатесі сұрауды өңдей алатын белгілі бір компьютер портында жай ғана қызмет болмаған жағдайда орын алуы мүмкін.

QNetworkReply::HostNotFoundError

Мүмкін, түсінікті қате болуы мүмкін, бұл сіз деректерді алуға тырысатын IP мекенжайын немесе доменді қате енгізгеніңізді білдіреді. Сондай-ақ, мұндай қате домен желіде енді қолжетімсіз болған жағдайда орын алуы мүмкін. Бұл қате 105 - қате нөміріне ұқсас ERR_NAME_NOT_RESOLVED (HTTP).

QNetworkReply::Timeout Error

Күту уақыты асып кетті. Ең жақын салыстыру - ICMP протоколын пайдалану, біз оны пингтеу кезінде желіде хосттың болуын тексеру. Яғни, желідегі түйін бар сияқты, бірақ ол жауап бермейді.

QNetworkReply::OperationCanceledError

Міне, Qt-дегі бағдарламаның әрекеттеріне сілтеме жасайтын қате. Бұл жағдайда бұл бағдарлама логикасы QNetworkAccessManager арқылы деректерді қабылдауды тоқтатқанда орын алады. Яғни, егер деректерді қабылдау әрекеті сырттан үзілген болса, бұл қате пайда болмауы керек. Сондықтан, егер сіз осындай қатені байқасаңыз, мәселені өз бағдарламаңыздан іздеңіз.

QNetworkReply::SslHandshakeFailedError

SSL шифрлауын пайдаланатын шифрланған байланыс арналарын орнату үшін қол алысу операциялары арқылы, яғни ақпаратты қабылдауды/беруді растау арқылы байланыс орнату қажет. Бұл жағдайда шифрлау параметрлері келісіледі, сеанс кілті беріледі, сонымен қатар клиент және клиент сервермен сервер аутентификациясының қосымша операциялары. Жоғарыда айтылғандардың біреуі дұрыс болмаса, бұл қате жіберіледі.

QNetworkReply::TemporaryNetworkFailureError и QNetworkReply::NetworkSessionFailedError

Бұл қателердің пайда болуы желіге физикалық қосылымның төмендеуіне дейін кез келген желі ақаулығынан туындауы мүмкін. Қосылымдарды QNetworkInterface. сыныбы арқылы тексеруге болады

QNetworkInterface класында QList статикалық әдісі бар QNetworkInterface::allInterfaces() ол компьютердегі барлық интерфейстердің тізімін қайтарады. Бұл жағдайда виртуалды машина үшін, мысалы, Virtual Box үшін жасалған қосылымдарға дейін мүлдем барлық қосылымдар ескеріледі. желі арқылы жұмыс істеуі керек әзірленуде және сонымен бірге әзірлеушінің бортында виртуалды машинасы бар, әсіресе ол жұмыс істеп тұрса, бұл тармақты ескеру керек, өйткені бағдарлама қосылым арқылы деректерді алуға тырысуы мүмкін. виртуалды машинаға, яғни ол желі қол жетімді деп есептейді, дегенмен әзірлеуші қосылым ажыратылған кезде Пайдаланушы жағдайын тексереді. Дегенмен, тіпті виртуалды машинаны өшіру кейбір мәселелерді тудырады, өйткені байланыс белсенді болады, бірақ Сілтеме қосылмайды.

Сондықтан, QNetworkReply::TemporaryNetworkFailureErro r және QNetworkReply::NetworkSessionFailedError қателерін алған кезде ненің дұрыс емес екенін түсіну үшін компьютер интерфейстерін белсенділікке тексеру керек: QNetworkInterface::IsUp QNetworkInterface ::IsRunning. *

QNetworkReply::BackgroundRequestNotAllowedError

Бірақ бұл қате қолданба әзірленіп жатқан платформа саясатына тікелей байланысты. Мысалы, егер кейбір дерексіз Android құрылғысында желі арқылы энергияны үнемдеу режимінде ақпарат алмасуға тыйым салынса, онда бұл режимде біз ақпарат алмасуға тырысқанда дәл осы қатені аламыз.

QNetworkReply::TooManyRedirectsError және QNetworkReply::InsecureRedirectError

Бірақ бұл қателер Qt 5.6-да жаңа. Енді сіз сайт беттерінен қайта бағыттаулар санының асып кетуін, сондай-ақ https шифрлауы бар беттерден шифрлаусыз беттерге қайта бағыттауларды бақылай аласыз. Веб-сайтты талдау үшін бағдарламалық жасақтаманы әзірлеу үшін не пайдалы болуы мүмкін.

Қосымша параметрлерсіз бұл қателер әдетте орын алмайды. Өйткені, QNetworkRequest орнатылып, онда конфигурация жалаулары орнатылмаған кезде, қайта бағыттау жүзеге асырылатын сайттан бетті сұрауға әрекет жасағанда, жаңа URL мекенжайына көшу болмайды және QNetworkReply пайдалы мазмұн болмайды. Сондықтан, QNetworkRequest жалауын орнатуыңыз керек QNetworkRequest::FollowRedirectsAttribute , содан кейін QNetworkAccessManager соңғы бетті алғанша немесе өту санының шегінен асып кеткенше қайта бағыттауларды бақылайды. Әдепкі бойынша, өтулер саны 50-ге дейін шектелген.

Атрибутты келесідей орнатуға болады:

QNetworkRequest request;  
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, QVariant(true));

QNetworkReply::InsecureRedirectError мәселесіне келетін болсақ, мақсат қауіпті протоколға қайта бағыттауды қадағалау.

QNetworkReply::Proxy* қателері

Келесі бес қате табиғаты бойынша прокси емес серверлерге қосылуға ұқсас.

QNetworkReply::ContentAccessDenied

Құжаттамада бұл қате HTTP жүйесіндегі 401 қатесіне ұқсайтыны айтылған, яғни авторизация қажет, бірақ бұл қате 403 және 407 коды алынған жағдайларда да орын алуы мүмкін деп ойлаймын. 407 қатесі 401 қатесіне ұқсас, бірақ прокси сервер үшін пайдаланылады. Ал 403 қатесі 401 және 407 қателері үшін негізгі болып табылады.

QNetworkReply::AuthenticationRequiredError

Бұл қате HTTP протоколына тән. Өйткені, http протоколы аутентификация схемаларын қолдайды. Бұл жағдайда логин мен парольді орнату арқылы серверге сұрау жіберу қажет. Бұл тікелей сайттарда аутентификацияланатын және сайтта рұқсат етілген режимде белгілі бір әрекеттерді орындайтын Qt қосымшасын жазуға болатындығын, яғни сайтта жұмыс істеу үшін бот жазуға болатындығын ескертемін.

Мәселені шешу - тіркелгі деректерін сұраумен араластыратын QAuthenticator жүйесінде пайдаланушының пайдаланушы аты мен құпия сөзін орнату. Бұған қоса, бұл QNetworkAccessManager::authenticationRequired сигналы арқылы автоматты түрде орындалады, бұл кезде логин мен құпия сөз кэштеледі, осылайша сигнал әрбір сұрауда шығарылмайды.

connect(&m_manager,&QNetworkAccessManager::authenticationRequired,
        [this](QNetworkReply *rep, QAuthenticator* auth){
            auth->setUser("username");
            auth->setPassword("passwordd");
        });

QNetworkReply::ContentReSendError

Бұл қате үшін HTTP кодтарымен нақты ұқсастық жасау қиын, себебі ол әртүрлі себептерге байланысты болуы мүмкін.

QNetworkReply::ContentConflictError

Бұл қате HTTP протоколындағы 409 Confilct қатесіне сәйкес келеді.

QNetworkReply::ContentGoneError

Бұл қате HTTP протоколындағы 410 Gone қатесіне сәйкес келеді.

QNetworkReply::InternalServer Error

Бұл қате http протоколындағы 500 ішкі сервер қатесіне сәйкес келеді.

QNetworkReply::OperationNotImplementedError

Бұл қате http протоколындағы 501 Орындалмаған қатесіне сәйкес келеді. Бұл, мысалы, сервер тек GET сұрауларын өңдейтін URL мекенжайына POST сұрауын жасауға әрекет жасағанда орын алады.

Мұндай әрекетті, мысалы, Django жобасында табуға болады. Егер сұрау орындалмаса, Django сервері POST сұрауына берілген кодпен бос бетті жібереді.

QNetworkReply::ProtocolUnknown Error

QNetworkReply::ProtocolUnknownError, сияқты қате url сұрауға протокол түрін көрсетпей жіберілгендіктен орын алуы мүмкін, яғни оның орнына

http://www.example.com

ауыстырылды

//www.example.com

Бұл мәселе беттерді талдап, суреттің URL мекенжайларын шығарып жатқанда орын алуы мүмкін. Мысалы, осы сайтта мақалалардағы барлық суреттердің мекенжайлары осылай көрінеді

/media/uploads/2017/02/03/testquickwidget.jpg

Яғни, сайттың хаттамасы мен домені көрсетілмеген. Сондықтан, егер сіз парақтан барлық кескін мекенжайларын шығарып алсаңыз, суреттерді қосымша өңдеусіз, атап айтқанда доменді және жолдың басындағы хаттаманы ауыстырмай, осы қатені ала алмайсыз.

QNetworkReply::ServiceUnavailable Error

http протоколындағы 503 Service Unavailable қатесіне сәйкес келеді

QNetworkReply::ProtocolInvalidOperationError

Бұл жағдайда хаттама анықталады, бірақ http хаттамасындағы қатенің дәл сәйкестігі қадағаланбайды; басқа хаттамаларға қатысты кез келген нәрсе болуы мүмкін.

QNetworkReply::Белгісіз желі қатесі

Бұл қатенің ең көп тараған нұсқасы http хаттамасындағы 502 Bad Gateway («жаман, қате шлюз») шлюз қатесі болып табылады.

QNetworkReply::Белгісізпрокси қатесі

Сондай-ақ 502 қатесі болуы мүмкін, бірақ прокси сервері бар нұсқада

Қате QNetworkReply::UnknownContentError,QNetworkReply::ProtocolFailure, QNetworkReply::UnknownServerError

Осы қателермен жұмыс хат-хабарын табу қиынға соғады, егер біреу оны кездестірсе, кеңес беруге қуаныштымын.

qDebug ішіндегі қате шығысы бар мысал

Сұрау нәтижесін өңдеу үшін қосылған ұяшықта QNetworkAccessManager сұрауды аяқтау сигналында қатені тексеруге болады.

manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished, this, &Downloader::onResult);

Бұл жағдайда QNetworkAccessManager сыныбының үстінде Жүктеу құралы деп аталатын орауыш класы бар. Бұл сыныпта onResult ұясы бар, ол өз кезегінде QNetworkAccessManager жауап нәтижесін өңдеуге жауапты.

void Downloader::onResult(QNetworkReply *reply)
{
    // Если в процессе получения данных произошла ошибка
    if(reply->error()){
        // Сообщаем об этом и показываем информацию об ошибках
        qDebug() << "ERROR";
        // Здесь получаем один из enum NetworkError, то есть код ошибки
        qDebug() << reply->error();
    } else {
        // ToDo something
    }
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

KL
  • Мамыр 5, 2017, 9:52 Т.Ж.

Unable to init SSL Context: Выдает приложение, что это может быть?

Evgenii Legotckoi
  • Мамыр 5, 2017, 11:19 Т.Ж.

OpenSSL библиотеки возможно требуются. В этой статье есть ссылки, где скачать библиотеки OpenSSL.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз