昨天,我尝试编写一个脚本,将数据发送到一个网站,但我遇到了一个奇怪的错误,即我解决了
我用windows cmd安装了这个perl模块(没有按顺序):
cpanm MIME::Base64
cpanm MIME::Parser
cpanm MIME::Tools
cpanm Test::XML
cpanm SOAP::Lite
cpanm SOAP::WSDL
cpan App::cpanminus这是我的旧脚本(caching.pl):
#!/usr/bin/perl
use MIME::Base64 ();
use SOAP::Lite ();
open( FILE, 'my.torrent' ) or die "$!";
while( read( FILE, $buf, 60*57 ) ) { $tor .= MIME::Base64::encode( $buf ); }
close( FILE );
$infoHash = SOAP::Lite->service( 'http://itorrents.org/api/torrage.wsdl' )->cacheTorrent( $tor );
print $infoHash;我遇到了这个错误(我解决了):
Service description 'http://itorrents.org/api/torrage.wsdl' can't be loaded: 500 Can't connect to itorrents.org:443我通过从torrage.wsdl下载http://itorrents.org/api/torrage.wsdl来解决问题,并替换了这一行(旧的caching.pl脚本):
$infoHash = SOAP::Lite->service( 'http://itorrents.org/api/torrage.wsdl' )->cacheTorrent( $tor );使用这一行(而不是位于网站中的torrage.wsdl,我尝试用我下载的torrage.wsdl文件所在位置的pc路径替换它):
$infoHash = SOAP::Lite->service( 'C:\Users\sussq\Desktop\perl2exe\torrage.wsdl' )->cacheTorrent( $tor );但现在我遇到了这个错误:
Service description 'C:\Users\sussq\Desktop\perl2exe\torrage.wsdl' can't be loaded: 501 Protocol scheme 'c' is not supported有人知道怎么解决这个问题吗?提前谢谢。
发布于 2022-01-22 14:46:45
您调用的service()方法的定义在SOAP的文档::Lite中给出如下:
服务(服务URL) $client->service('http://svc.perl.org/Svc.wsdl');
因此,需要传递给方法的参数是URL -- WSDL文件的地址。
最初,您将URL - http://itorrents.org/api/torrage.wsdl传递给它。但是,由于某些原因,这是行不通的(从你的答案,似乎你已经找到了问题的根本)。
因此,您在本地保存了WSDL文件,并将本地文件的位置传递给方法。这不起作用,因为'C:\Users\sussq\Desktop\perl2exe\torrage.wsdl‘不是一个有效的URL。
URL的第一部分(冒号之前的位)是‘协议’。这意味着它定义了用于检索此资源的机制。在基于web的URL中,要么是'http‘,要么是'https’。您试图传递给该方法的本地路径与'c:‘比率很高,因此该方法认为这是一个协议。但这不是它所知道的,所以你会得到你的错误信息。
有一种将URL构建到本地文件的机制。这叫做文件:协议。我不是Windows方面的专家,但我认为您的URL应该是:
file:///C:/Users/sussq/Desktop/perl2exe/torrage.wsdl发布于 2022-01-22 18:36:23
需要一个URI,并且
C:\Users\sussq\Desktop\perl2exe\torrage.wsdl不是一个。你可以用
file:///C:/Users/sussq/Desktop/perl2exe/torrage.wsdl但如果我们不想硬编码一条绝对路径呢?我们可以利用以下几点:
use Cwd qw( abs_path );
use FindBin qw( $RealBin );
use URI::file qw( );
my $uri = URI::file->new( abs_path( "$RealBin/torrage.wsdl" ) )->as_string;这将在与脚本相同的目录中查找torrage.wsdl。
https://stackoverflow.com/questions/70811664
复制相似问题