Perl 6 中的 urlopen 方法?
urlopen method in Perl 6?
我正在将 Python 模块转换为 Perl 6,但找不到名为 urlopen 的方法,它可以接受 data:
from six.moves.urllib import request
req = request.Request(url, headers=headers)
if headers.get('Content-Type') == 'application/x-www-form-urlencoded':
data = oauth_query(args, via='quote_plus', safe='').encode()
elif 'form-data' in headers.get('Content-Type', ''): # multipart/form-data
data = args['form-data']
else:
data = None
resp = request.urlopen(req, data=data)
resp.json = lambda: json.loads(resp.read().decode() or '""')
return resp
oauth_query
是一种 return 排序字符串的方法:
def oauth_query(args, via='quote', safe='~'):
return '&'.join('%s=%s' % (k, oauth_escape(v, via, safe)) for k, v in sorted(args.items()))
我将上面的代码翻译成 Perl 6:
use WWW;
my $data = "";
if %headers{'Content-Type'} eq 'application/x-www-form-urlencoded' {
$data = oauth_query(%args);
} elsif %headers{'Content-Type'}.contains('form-data') {
$data = %args{'form-data'};
} else {
$data = Any;
}
my $res = get $url, |%headers; # but without data that contains Content-Type, it will
# Died with HTTP::MediaType::X::MediaTypeParser::IllegalMediaType
我想 return 一个 resp
和 Python 一样。欢迎任何帮助!
我已将程序减少到最低限度;您仍然需要处理 headers 和 OAuth 查询,但这有效
use WWW;
sub MAIN( :$have-data = 0 ) {
my $url='https://jsonplaceholder.typicode.com/posts/';
my %args=%(form-data => "userId=1&id=2");
my $data = "";
if $have-data {
$data = %args{'form-data'};
}
my $res;
if $data {
$res = post $url, $data;
} else {
$res= get $url~'1';
}
say $res;
}
Baseline是Python中的urlopen
确实得到或者post,这取决于有没有数据。在这种情况下,我为此目的使用了一个简单的 if
,因为 WWW
非常准系统并且不支持它。我也在使用模拟 REST 接口,所以我实际上必须根据数据更改 URL,这也是虚拟数据。您可以不带参数或使用
调用程序
perl6 urlopen.p6 --have-data=1
模拟服务器会 return... 一些东西。如果您贡献了一个比 WWW 级别(稍微)更高的模块,或者贡献给 WWW 本身,那就太好了。希望这可以解决(有点)您的问题。
use Cro::HTTP::Client;
my $resp;
my $data = "";
if (%headers{'content-type'} // '') eq self.form_urlencoded {
$data = oauth_query(%args);
} elsif (%headers{'content-type'} // '').contains('form-data') { # multipart/form-data
$data = %args{'form-data'};
} else {
$data = "";
}
my $client = Cro::HTTP::Client.new(headers => |%headers);
if $data {
$resp = await $client.post: $url, body => |%args;
} else {
$resp = await $client.get: $url;
}
return $resp;
我正在将 Python 模块转换为 Perl 6,但找不到名为 urlopen 的方法,它可以接受 data:
from six.moves.urllib import request
req = request.Request(url, headers=headers)
if headers.get('Content-Type') == 'application/x-www-form-urlencoded':
data = oauth_query(args, via='quote_plus', safe='').encode()
elif 'form-data' in headers.get('Content-Type', ''): # multipart/form-data
data = args['form-data']
else:
data = None
resp = request.urlopen(req, data=data)
resp.json = lambda: json.loads(resp.read().decode() or '""')
return resp
oauth_query
是一种 return 排序字符串的方法:
def oauth_query(args, via='quote', safe='~'):
return '&'.join('%s=%s' % (k, oauth_escape(v, via, safe)) for k, v in sorted(args.items()))
我将上面的代码翻译成 Perl 6:
use WWW;
my $data = "";
if %headers{'Content-Type'} eq 'application/x-www-form-urlencoded' {
$data = oauth_query(%args);
} elsif %headers{'Content-Type'}.contains('form-data') {
$data = %args{'form-data'};
} else {
$data = Any;
}
my $res = get $url, |%headers; # but without data that contains Content-Type, it will
# Died with HTTP::MediaType::X::MediaTypeParser::IllegalMediaType
我想 return 一个 resp
和 Python 一样。欢迎任何帮助!
我已将程序减少到最低限度;您仍然需要处理 headers 和 OAuth 查询,但这有效
use WWW;
sub MAIN( :$have-data = 0 ) {
my $url='https://jsonplaceholder.typicode.com/posts/';
my %args=%(form-data => "userId=1&id=2");
my $data = "";
if $have-data {
$data = %args{'form-data'};
}
my $res;
if $data {
$res = post $url, $data;
} else {
$res= get $url~'1';
}
say $res;
}
Baseline是Python中的urlopen
确实得到或者post,这取决于有没有数据。在这种情况下,我为此目的使用了一个简单的 if
,因为 WWW
非常准系统并且不支持它。我也在使用模拟 REST 接口,所以我实际上必须根据数据更改 URL,这也是虚拟数据。您可以不带参数或使用
perl6 urlopen.p6 --have-data=1
模拟服务器会 return... 一些东西。如果您贡献了一个比 WWW 级别(稍微)更高的模块,或者贡献给 WWW 本身,那就太好了。希望这可以解决(有点)您的问题。
use Cro::HTTP::Client;
my $resp;
my $data = "";
if (%headers{'content-type'} // '') eq self.form_urlencoded {
$data = oauth_query(%args);
} elsif (%headers{'content-type'} // '').contains('form-data') { # multipart/form-data
$data = %args{'form-data'};
} else {
$data = "";
}
my $client = Cro::HTTP::Client.new(headers => |%headers);
if $data {
$resp = await $client.post: $url, body => |%args;
} else {
$resp = await $client.get: $url;
}
return $resp;