2016-07-01 2 views
0

Я хочу отправить запрос http GET с помощью PyQt.Как отправить http-запрос с PyQt?

Несмотря на мои исследования, я не нашел примеров таких простых манипуляций в python.

Я получил код (который я изменил в соответствии с подсказками, данными Бакуриу в комментариях), но он не работает. Предположим, я хочу сделать запрос на веб-страницу facebook и напечатать ответ, который должен быть HTML-содержимым страницы.

from PyQt4 import QtCore, QtNetwork, QtCore, QtGui 
from PyQt4.QtCore import * 
import sys 
from functools import partial 

def printContent(): 
    answerAsText = QString(replyObject.readAll()) 
    print answerAsText 

app = QtCore.QCoreApplication(sys.argv) 

url = QtCore.QUrl("http://www.facebook.com") 
request = QtNetwork.QNetworkRequest() 
request.setUrl(url) 
manager = QtNetwork.QNetworkAccessManager() 

replyObject = manager.get(request) 
replyObject.finished.connect(printContent) 

sys.exit(app.exec_()) 

Это не вызывает никакой ошибки, оно просто ничего не печатает. Я не знаю, где проблема: Является ли мой запрос неправильным? Или это так, как я обрабатываю объект ответа впоследствии?

Почему это не работает? Может ли кто-нибудь показать мне действующий код?

+0

'QNetworkReply' - это' QIODevice', поэтому он предоставляет методы ['readData' и' readLineData'] (http://doc.qt.io/qt-5/qiodevice.html#protected-functions). – Bakuriu

+0

Да, я уже искал в этом направлении. Но я не понимаю, как это работает. Все функции (read, readAll, readData, readLine) возвращают QByteArrays, и я не знаю, что с ними делать. + readData принимает аргумент int, смысл которого я не получаю. Не могли бы вы немного подробнее узнать, как обращаться с этим объектом. –

+0

Ну, 'QByteArray' - это просто текст. Если вы хотите, чтобы это как текст, вы можете просто «text = QString (data)». – Bakuriu

ответ

0

Похоже, пример URL-адреса плох. Попробуйте www.google.com. Я адаптировал ваш код для PyQt5. Оно работает.

from PyQt5.QtCore import QUrl 
from PyQt5.QtWidgets import QApplication, QMainWindow 
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest 
import sys 

def printContent(): 
    answerAsText = bytes(replyObject.readAll()).decode("utf-8") 
    print(answerAsText) 


class mainClass(): 
    def my_exception_hook(exctype, value, traceback): 

     print(exctype, value, traceback) 

     sys._excepthook(exctype, value, traceback) 
     sys.exit(1) 

    sys.excepthook = my_exception_hook 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    url = QUrl("http://www.google.com") 

    request = QNetworkRequest() 
    request.setUrl(url) 
    manager = QNetworkAccessManager() 

    replyObject = manager.get(request) 
    replyObject.finished.connect(printContent) 

    sys.exit(app.exec_()) 
0

Нам нужно создать QApplication или QtCoreApplication, потому что мы используем механизм сигналов и слотов. Также обратите внимание, что ответ должен быть декодирован с QByteArray.

Вот рабочий пример:

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

from PyQt5 import QtCore, QtGui, QtNetwork 
import sys 


class Example: 

    def __init__(self):  

     self.doRequest() 


    def doRequest(self): 

     url = "http://www.something.com" 
     req = QtNetwork.QNetworkRequest(QtCore.QUrl(url)) 

     self.nam = QtNetwork.QNetworkAccessManager() 
     self.nam.finished.connect(self.handleResponse) 
     self.nam.get(req)  


    def handleResponse(self, reply): 

     er = reply.error() 

     if er == QtNetwork.QNetworkReply.NoError: 

      bytes_string = reply.readAll() 
      print(str(bytes_string, 'utf-8')) 

     else: 
      print("Error occured: ", er) 
      print(reply.errorString()) 

     QtCore.QCoreApplication.quit()  


if __name__ == '__main__':  

    app = QtCore.QCoreApplication([]) 
    ex = Example() 
    sys.exit(app.exec_()) 

Если вы запустите это приложение, вы получите HTML-код очень простой веб-страницы (www.something.com).

Смежные вопросы