我可以使用REST :: Client来调用自定义动词,例如“REJECT”吗?

时间:2015-12-01 12:10:26

标签: perl rest

我必须使用REJECT动词调用第三方REST API。

试图简单地使用REST :: Client :: request失败,抱怨REJECT不是为数不多的标准方法之一:

  

REST :: Client异常:请求的第一个参数必须是GET,PATCH,PUT,POST,DELETE,OPTIONS,HEAD

之一

我还可以使用REST :: Client拨打电话吗?我是否必须完全使用不同的库?我知道,作为最后的手段,curl咒语可能有用,但是......

2 个答案:

答案 0 :(得分:1)

不,你不能。

REST::Client has the verbs built into an error checkrequest方法的一部分,不可注入,因此您不能简单地覆盖它而不覆盖并重建整个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根本不关心该方法。它逐字使用它。你可以在那里放置任何你想要的东西,无论是requestGetGET还是get。很可能另一端的服务器不同意最后一个服务器......

答案 1 :(得分:1)

老实说,我对REST知之甚少并不知道这是否是一个足够通用的解决方案,但是有点谷歌搜索似乎同意这应该适用于大多数行为良好的REST API,包括我使用的那个:

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