Perl 6中的urlopen方法?

che*_*nyf 6 raku

我正在将Python模块转换为Perl 6,但找不到一个名为urlopen的方法,它可以接受数据:

    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
Run Code Online (Sandbox Code Playgroud)

oauth_query 是一个返回已排序字符串的方法:

def oauth_query(args, via='quote', safe='~'):
    return '&'.join('%s=%s' % (k, oauth_escape(v, via, safe)) for k, v in sorted(args.items()))
Run Code Online (Sandbox Code Playgroud)

我将上面的代码翻译成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
Run Code Online (Sandbox Code Playgroud)

我想resp在Python中返回一个.欢迎任何帮助!

jjm*_*elo 3

我已将程序缩减到最低限度;您仍然需要处理标头和 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;
}
Run Code Online (Sandbox Code Playgroud)

基线是urlopenPython中的get或post取决于是否有数据。在本例中,我使用 simpleif来实现此目的,因为WWW它非常简单并且不支持这一点。我还使用模拟 REST 接口,因此我实际上必须根据数据(也是虚拟数据)更改 URL。您可以不带参数或带参数调用该程序

perl6 urlopen.p6 --have-data=1
Run Code Online (Sandbox Code Playgroud)

模拟服务器将返回...一些东西。如果您贡献了一个比 WWW 或 WWW 本身更高级别的模块,那就太好了。希望这能解决(有点)您的问题。