- 1. QNetworkReply::ConnectionRefusedError және QNetworkReply::RemoteHostClosedError
- 2. QNetworkReply::HostNotFoundError
- 3. QNetworkReply::Timeout Error
- 4. QNetworkReply::OperationCanceledError
- 5. QNetworkReply::SslHandshakeFailedError
- 6. QNetworkReply::TemporaryNetworkFailureError и QNetworkReply::NetworkSessionFailedError
- 7. QNetworkReply::BackgroundRequestNotAllowedError
- 8. QNetworkReply::TooManyRedirectsError және QNetworkReply::InsecureRedirectError
- 9. QNetworkReply::Proxy* қателері
- 10. QNetworkReply::ContentAccessDenied
- 11. QNetworkReply::AuthenticationRequiredError
- 12. QNetworkReply::ContentReSendError
- 13. QNetworkReply::ContentConflictError
- 14. QNetworkReply::ContentGoneError
- 15. QNetworkReply::InternalServer Error
- 16. QNetworkReply::OperationNotImplementedError
- 17. QNetworkReply::ProtocolUnknown Error
- 18. QNetworkReply::ServiceUnavailable Error
- 19. QNetworkReply::ProtocolInvalidOperationError
- 20. QNetworkReply::Белгісіз желі қатесі
- 21. QNetworkReply::Белгісізпрокси қатесі
- 22. Қате QNetworkReply::UnknownContentError,QNetworkReply::ProtocolFailure, QNetworkReply::UnknownServerError
- 23. qDebug ішіндегі қате шығысы бар мысал
Сабақтардың бірінде 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 статикалық әдісі бар
Сондықтан, 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 } }
Unable to init SSL Context: Выдает приложение, что это может быть?
OpenSSL библиотеки возможно требуются. В этой статье есть ссылки, где скачать библиотеки OpenSSL.
However, while it is easy to coax them into elements of different tissues in culture, they do not organize themselves as they do in embryos priligy pills