我必须使用REJECT
动词调用第三方REST API。
试图简单地使用REST :: Client :: request失败,抱怨REJECT不是为数不多的标准方法之一:
REST :: Client异常:请求的第一个参数必须是GET,PATCH,PUT,POST,DELETE,OPTIONS,HEAD
之一
我还可以使用REST :: Client拨打电话吗?我是否必须完全使用不同的库?我知道,作为最后的手段,curl
咒语可能有用,但是......
答案 0 :(得分:1)
不,你不能。
REST::Client has the verbs built into an error check是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
但使用不同的正则表达式,并为{{添加您自己的便捷方法1}}。它看起来就像那样。
REJECT
然后您可以使用您的包而不是原始包。当然,它不会受益于REST :: Client的更新,因此如果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', @_);
}
在将来的版本中发生更改,则必须自行更新。
这是有效的,因为底层HTTP :: Request根本不关心该方法。它逐字使用它。你可以在那里放置任何你想要的东西,无论是request
,Get
,GET
还是get
。很可能另一端的服务器不同意最后一个服务器......
答案 1 :(得分:1)
老实说,我对REST知之甚少并不知道这是否是一个足够通用的解决方案,但是有点谷歌搜索似乎同意这应该适用于大多数行为良好的REST API,包括我使用的那个:
$client->addHeader('X-HTTP-Method-Override', 'REJECT');
$client->POST(...);