我不知道perl的一件事,但是从一个大的perl脚本,我设法得到相关的部分并发出HTTP请求。所以,这个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
根据我的理解,它正在使用指定数据对URL进行POST。有了这个基础,我的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"
请帮我制作一个与perl代码等效的Python。
答案 0 :(得分: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中分析后,我实际上发现了这一点。
答案 1 :(得分: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()