我必须使用REJECT
谓词调用第三方REST API。
尝试简单地使用REST::Client::请求失败,抱怨REJECT不是少数几个标准方法之一:
REST::客户端异常:请求的第一个参数必须是GET、PATCH、PUT、POST、DELETE、OPTIONS、HEAD 之一
我仍然可以使用REST::客户端进行呼叫吗?我必须完全使用不同的图书馆吗?我知道,作为最后的手段,curl
咒语可能会奏效,但。。。
不可以
REST::客户端在错误检查中内置了谓词,该错误检查是request
方法的一部分,并且是不可注入的,因此您不能在不覆盖和重建整个request
的情况下简单地覆盖它。
#error check croak "REST::Client exception: First argument to request must be one of GET, PATCH, PUT, POST, DELETE, OPTIONS, HEAD" unless $method =~ /^(get|patch|put|post|delete|options|head)$/i;
但是,如果这不是问题,您可以对其进行子类,用一个精确的副本但不同的正则表达式覆盖request
,并为REJECT
添加您自己的方便方法。它看起来像那样。
package REST::Client::WithReject;
use parent 'REST::Client';
sub request {
my $self = shift;
# original code ...
#error check
croak "REST::Client exception: First argument to request must be one of GET, PATCH, PUT, POST, DELETE, OPTIONS, HEAD, REJECT" unless $method =~ /^(get|patch|put|post|delete|options|head|reject)$/i;
# original code ...
}
sub REJECT {
my $self = shift;
return $self->request('REJECT', @_);
}
然后你可以用你的包裹代替原来的包裹。当然,它不会从REST::Client的更新中受益,所以如果request
在未来的版本中发生更改,您必须更新自己。
这是因为底层HTTP::Request根本不关心该方法。它逐字逐句地使用它。你可以把你想要的东西放在那里,无论是Get
、GET
、get
还是GETTHEFSCKOUT
。最有可能的是,另一端的服务器不会同意最后一个。。。
老实说,我对REST的了解还不够,不知道这是否是一个足够通用的问题解决方案,但谷歌搜索似乎同意这应该适用于大多数表现良好的RESTAPI,包括我使用的:
$client->addHeader('X-HTTP-Method-Override', 'REJECT');
$client->POST(...);