我可以使用 REST::Client 调用自定义谓词(如 "REJECT")吗?



我必须使用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根本不关心该方法。它逐字逐句地使用它。你可以把你想要的东西放在那里,无论是GetGETget还是GETTHEFSCKOUT。最有可能的是,另一端的服务器不会同意最后一个。。。

老实说,我对REST的了解还不够,不知道这是否是一个足够通用的问题解决方案,但谷歌搜索似乎同意这应该适用于大多数表现良好的RESTAPI,包括我使用的:

$client->addHeader('X-HTTP-Method-Override', 'REJECT');
$client->POST(...);

最新更新