2010-07-21 126 views
2

我使用Twisted web「HTTPClient」協議與http服務器進行對話(使用扭曲的應用程序作爲客戶端),問題是我的大部分請求都不接受我的頭文件。有沒有某種方式(也許使用某些庫)來生成頭? 我會後一些代碼,所以你可以看看在Twisted客戶端生成頭文件

class Local(HTTPClient): 
def generateHeaders(self, type=None): 
    self.sendHeader('User-Agent', 'Twisted Web Client') 
    if type: 
     self.sendHeader('Content-Type', 'x-www-form-urlencoded') 
    self.sendHeader('Accept', '*/*') 
    self.sendHeader('Host', 'localhost') 
    self.endHeaders() 

def connectionMade(self): 
    ## GENERATE ID 
    self.userid= self.generateID() 
    self.sendCommand('POST', '/chat/action=join&user=pirosb3') 
    self.generateHeaders(type=True) 

def dataReceived(self, data): 
    print data 

正如你所看到的,我創建了一個對我產生頭的方法,但不是很有效,我必須說,我總是得到錯誤響應。

任何人都知道解決方案嗎?

感謝

+1

你的問題並不能說明問題我覺得對於任何人來說都足夠詳細。 「效率不高」是什麼意思?關於「我的請求不接受我的標題」呢?爲什麼不'sendHeader'「生成[a]頭文件」適合你? – 2010-07-21 22:24:50

回答

3

我肯定會建議你使用Twisted的Agent類與twisted.web.http_headers模塊中的Header類一起。

有一個很好的指南可用here

如果你需要它增加了一些頭的請求,並可以讀答案的那些扭曲的一個HTTP客戶端的一個活生生的例子,那就是:

from pprint import pformat 

from twisted.internet import reactor 
from twisted.internet.defer import Deferred 
from twisted.internet.protocol import Protocol 
from twisted.web.client import Agent 
from twisted.web.http_headers import Headers 

class BeginningPrinter(Protocol): 
    def __init__(self, finished): 
     self.finished = finished 
     self.remaining = 1024 * 10 

    def dataReceived(self, bytes): 
     if self.remaining: 
      display = bytes[:self.remaining] 
      print 'Some data received:' 
      print display 
      self.remaining -= len(display) 

    def connectionLost(self, reason): 
     print 'Finished receiving body:', reason.getErrorMessage() 
     self.finished.callback(None) 

agent = Agent(reactor) 
d = agent.request(
    'GET', 
    'http://example.com/', 
    Headers({'User-Agent': ['Twisted Web Client Example']}), 
    None) 

def cbRequest(response): 
    print 'Response version:', response.version 
    print 'Response code:', response.code 
    print 'Response phrase:', response.phrase 
    print 'Response headers:' 
    print pformat(list(response.headers.getAllRawHeaders())) 
    finished = Deferred() 
    response.deliverBody(BeginningPrinter(finished)) 
    return finished 
d.addCallback(cbRequest) 

def cbShutdown(ignored): 
    reactor.stop() 
d.addBoth(cbShutdown) 

reactor.run()