2012-12-26 78 views
2

我不知道perl的一個單一的東西,但從一個大的perl腳本,我設法得到相關的部分,併發出一個HTTP請求。所以,這個Perl代碼完美地工作。編寫Python代碼相當於Perl代碼

#!/usr/bin/perl -w 

use strict; 
use LWP::UserAgent; 
use HTTP::Request::Common; 

my $ua = new LWP::UserAgent; 

my $request = "X-CTCH-PVer: 0000001\r\n"; 

my $method_url = "http://localhost:8088/ctasd/GetStatus"; 
my $response = $ua->request (POST $method_url,Content => $request); 

my $data = $response->status_line . "\n"; 
print $data; 
print $response->content; 

上面的代碼輸出:

200 OK 
X-CTCH-PVer: 0000001 

從我的理解,它是做一個POST到與指定數據的URL。與此基礎上,我的Python代碼如下所示:

#!/usr/bin/python 

import urllib 

url = "http://localhost:8088/ctasd/GetStatus" 
data = urllib.urlencode([("X-CTCH-PVer", "0000001")]) 

print urllib.urlopen(url, data).read() 

但是,這將返回響應爲:

X-CTCH-Error: Missing protocol header "X-CTCH-PVer" 

請幫我在做一個Python等同的Perl代碼。

回答

2

因此,實際情況是,Perl中的$request實際上是作爲POST數據發送的,沒有任何改變。現在我明白爲什麼Perl中的名字是content

#!/usr/bin/python 

import urllib 

url = "http://localhost:8088/ctasd/GetStatus" 
print urllib.urlopen(url, "X-CTCH-PVer: 0000001").read() 

工作。我在這兩種情況下捕獲流量並在wireshark中分析後發現了這一點。

0

的錯誤是因爲你不發送頭,你這是/發送urlencoded的字符串,因此功能urllib.urlencode

嘗試設置與實際的頭請求:

#!/usr/bin/python 

import urllib2 


request = urllib2.Request("http://localhost:8088/ctasd/GetStatus", headers={"X-CTCH-PVer" : "0000001"}) 
contents = urllib2.urlopen(request).read() 
+0

這給404找不到。具有此API的程序真的很糟糕,因爲它提供了錯誤信息,所以這個頭文件錯誤可能是騙人的。 –