简体   繁体   中英

How to send http request with PyQt?

I want to send http GET request using PyQt.

Despite my researches, I haven't found any examples of that simple manipulation in python.

I've ended up with some code (that I have modified according to the hints given by Bakuriu in the comments), but it doesn't work. Let's say I want to make a get request to facebook webpage, and print the answer, which should be the HTML content of the page.

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_())

This doesn't raise any error, it just doesn't print anything. I don't know where the problem is : Is my request wrong ? Or is it the way I handle the reply object afterwards ?

Why doesn't it work ? Could somebody please show me a functioning code ?

We need to create a QApplication or QtCoreApplication , because we are using the signal and slot mechanism. Notice also that the response has to be decoded from a QByteArray .

Here is a working example:

#!/usr/bin/python

from PyQt5 import QtCore, QtGui, QtNetwork
import sys
      
      
class Example:
  
    def __init__(self):    
        
        self.doRequest()
        
        
    def doRequest(self):   
    
        url = "http://webcode.me"
        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_())

If you run this application, you will get the HTML code of a very simple web page.

Looks like the URL example is bad. Try www.google.com. I've adapted your code for PyQt5. It works.

 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_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM