¿Método URLOPEN en PERL 6? -- raku camp Relacionados El problema

urlopen method in Perl 6?


6
vote

problema

Español

Estoy traduciendo un módulo Python a Perl 6, pero no puede encontrar un método llamado Urlopen , que podría aceptar datos :

      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 es un método que devuelve una cadena ordenada:

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

Traduzco el código anterior a 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   

Quiero devolver un resp como en Python. Cualquier ayuda es bienvenida!

Original en ingles

I'm translating a Python module to Perl 6, but can't find a method called urlopen, which could accept 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 is a method that return a sorted string:

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

I translate the above code to 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 

I want to return a resp as in Python. Any help is welcome!

  
         
         

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

He reducido el programa al mínimo; Aún tendrá que cuidar de los encabezados y la consulta de OAURH, pero esto funciona

  savedRoundList(response.body(), mActivity, mContext); 111  

La línea de base es que savedRoundList(response.body(), mActivity, mContext); 2 en Python obtiene o publica dependiendo de si hay datos o no. En este caso, utilizo un simple @Display(Layout.ZoneName)13 para ese propósito, ya que savedRoundList(response.body(), mActivity, mContext); 4 es bastante borroso y no es compatible con eso. Estoy usando también una interfaz de reposo simulado, por lo que en realidad he cambiado la URL según los datos, que también son datos ficticios. Puede llamar al programa con ningún argumento o con

  savedRoundList(response.body(), mActivity, mContext); 5  

y el servidor simulado volverá ... algo. Sería genial si contribuyó con un módulo con un nivel más alto que WWW, o con WWW. Espero que esto resuelva (un poco) su problema.

 

I have reduced the program to the bare minimum; you will still have to take care of headers and the OAuth query, but this works

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 is that urlopen in Python does get or post depending on whether there is data or not. In this case, I use a simple if for that purpose, since WWW is quite barebones and does not support that. I am using also a mock REST interface, so I have actually to change the URL depending on the data, which is also dummy data. You can call the program either with no argument or with

perl6 urlopen.p6 --have-data=1 

and the mock server will return... something. It would be great if you contributed a module with a (somewhat) higher level than WWW, or to WWW itself. Hope this solves (kinda) your problem.

 
 
 
 
2
 
vote
  savedRoundList(response.body(), mActivity, mContext); 6  
 
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; 
 
 

Relacionados problema

3  ¿Cómo igualar el mismo número de átomos diferentes en PERL 6 REGEX?  ( How to match the same number of different atoms in perl 6 regex ) 
debería ser muy simple, pero no puedo hacer frente a ella. Quiero coincidir exactamente con el mismo número de a S que b S. Entonces, lo siguiente my...

7  Perl6 / Raku: ¿Cómo restringir los valores permitidos en una variable?  ( Perl6 raku how to i restrict the values allowed in a variable ) 
perl6 / raku Me gustaría crear un sub Subas que solo se permiten ciertos valores. Y no pasar el valor permitido creará un error de verificador (Perl6 -C). ...

5  ¿Dónde está Rakudo X86 instalador / binarios precompilados de 32 bits?  ( Where is rakudo x86 32 bit precompiled installer binaries ) 
Me gustaría escribir mi programa usando Perl6 / Rakudo y debe ejecutarse en OSEs de 32 bits y de 64 bits (Windows y Linux). Pero ya no se publicará más de 3...

9  No se puede sobrecargar el >> operador en raku  ( Cant overload the operator in raku ) 
Estoy tratando de sobrecargar el & gt; & gt; Operador así: class A {} multi sub infix:«>>»(A:D $a, Str() $b) is assoc<non> { dd $a; dd $b } my $x = A.new;...

12  ¿Cuál es la fecha de lanzamiento de RAKUDO STAR (PERL6)? [cerrado]  ( What is the release date for rakudo star perl6 ) 
Es poco probable que esta pregunta ayude a cualquier visitante futuro; Solo es relevante para un pequeño área geográfica, u...

11  ¿Perl 6 tiene un equivalente al método de actualización de Python en el diccionario?  ( Does perl 6 have an equivalent to pythons update method on dictionary ) 
En Python, si actualizo el diccionario > my %hash = 'Python' => 2, Perl => 5; > my %u = Perl => 6 > %hash.append(%u) {Perl => [5 6], Python => 2} 2 con otro...

12  ¿Cómo puedo compilar el archivo Perl6 a EXE?  ( How can i compile perl6 file to exe ) 
Estoy jugando con la versión Perl6 que se construyó en Moarvm en Windows. Creé un archivo PERL6 y quiero compilarlo a EXE. Probé lo siguiente: perl6 --targ...

5  ¿Puede Raku garantizar que una coincidencia de patrones es exhaustiva (en el tiempo de compilación)?  ( Can raku guarantee that a pattern match is exhaustive at compile time ) 
Considere el siguiente código de juguete: my $age-check = do given 18 { when $_ > 18 { 'old enough' } when $_ < 18 { 'too young' } }; say "The u...

7  ¿Es seguro, compartir una matriz entre hilos?  ( Is it safe to share an array between threads ) 
¿Es seguro, para compartir una matriz entre promesas como lo hice en el siguiente código? #!/usr/bin/env perl6 use v6; sub my_sub ( $string, $len ) { ...

5  Cro ejecutar lanzando conexión reinicio por pares  ( Cro run throwing connection reset by peer ) 
Estoy tratando de implementar el servicio de CRO desde la documentación de la introducción de CRO. Se compiló bien, pero cuando intenté acceder al enlace medi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos