2012-12-26 39 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的程序真的很糟糕,因为它提供了错误信息,所以这个头文件错误可能是骗人的。 –