如何将ItemFilters与易趣一起使用::API::Simple::Finding



我正在使用易趣::API::Simple::Finding从易趣获取已售出的物品,我想使用ItemFilters,但我看不到它们的去向。特别是我希望使用项目过滤器

(itemFilter.name = SoldItemsOnly, itemFilter.value = true)
and
(itemFilter.name = Condition, itemFilter.value = Used)

我试着在这里直接包括以下内容:

keywords => '"princess cut", "diamond ring", -"14k*"', 
Condition => 'Sold',
SoldItemsOnly => 'true', 
sortOrder => 'PricePlusShippingHighest'

我已经做了很长一段时间了,虽然我确信它在某种程度上是非常直接的,但我似乎无法获得

use eBay::API::Simple::Finding;
my $api = eBay::API::Simple::Finding->new( {
appid   => 'APIKEY',
siteid  => 'EBAY-AU',
} );
$api->execute( 
'findCompletedItems', { 
keywords => '"princess cut", "diamond ring", -"14k*"',  
sortOrder => 'PricePlusShippingHighest',
} 
);
if ( $api->has_error() ) {
die "Call Failed:" . $api->errors_as_string();
}
my $dom  = $api->response_dom();
my $hash = $api->response_hash();

,非常感谢您的帮助

至于我看到了什么?排序工作,按关键字搜索工作,但项目过滤器不工作,所以它返回新的&已完成的二手物品,无论是已售出的还是未售出的

阅读有关findCompletedItems的易趣API文档可以看出,您需要为ItemFilters使用子元素。有一个示例很好地显示了这一点(链接)。

<?xml version="1.0" encoding="UTF-8"?>
<findCompletedItemsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services">
<keywords>Garmin nuvi 1300 Automotive GPS Receiver</keywords>
<categoryId>156955</categoryId>
<itemFilter>
<name>Condition</name>
<value>3000</value>
</itemFilter>
<itemFilter>
<name>FreeShippingOnly</name>
<value>true</value>
</itemFilter>
<itemFilter>
<name>SoldItemsOnly</name>
<value>true</value>
</itemFilter>
<sortOrder>PricePlusShippingLowest</sortOrder>
<paginationInput>
<entriesPerPage>2</entriesPerPage>
<pageNumber>1</pageNumber>
</paginationInput>
</findCompletedItemsRequest>

查看易趣::API::Simple::Finding模块的源代码,我们可以看到它使用XML::Simple来构造请求。虽然一般来说XML::Simple是不鼓励的,但我们将不得不与之合作。

深入查看ItemFilter的文档可以发现,我们可以为每个过滤器提供一个<itemFilter>块。这意味着多个1被自动地视为AND。

为了在API模块中以XML::Simple的方式设置单个项,我们只需要一个hashref。

{
itemFilter => {
name => 'Condition',
value => 3000,
},
}

将成为

<itemFilter>
<name>Condition</name>
<value>3000</value>
</itemFilter>

为了得到几个,我们需要在itemFilter键后面有一个数组引用。

{
itemFilter => [
{
name => 'Condition',
value => 3000,
},
{
name => 'FreeShippingOnly',
value => 'true',
},
],
}

这将生成此XML。

<itemFilter>
<name>Condition</name>
<value>3000</value>
</itemFilter>
<itemFilter>
<name>FreeShippingOnly</name>
<value>true</value>
</itemFilter>

到目前为止还不错。我们可以很容易地将其破解到API模块调用中。我没有直接执行调用,而是准备好了它,然后调用了私有方法_get_request_body,该方法使用XML::Simple来形成和返回请求正文字符串。这很好地检查了请求是否正常。我通过阅读代码,从上面的一行开始,然后朝着提供execute的基类努力,发现了这一点。

use eBay::API::Simple::Finding;
my $api = eBay::API::Simple::Finding->new( {
appid   => 'APIKEY',
siteid  => 'EBAY-AU',
} );
$api->prepare(
'findCompletedItems',
{
keywords   => '"princess cut", "diamond ring", -"14k*"',
sortOrder  => 'PricePlusShippingHighest',
itemFilter => [
{
name  => 'SoldItemsOnly',
value => 'true',
},
{
name  => 'Condition',
value => 'Used',
},
],
}
);
print $api->_get_request_body;

下面是出现的XML。

<?xml version='1.0' encoding='utf-8'?>
<findCompletedItemsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services">
<itemFilter>
<name>SoldItemsOnly</name>
<value>true</value>
</itemFilter>
<itemFilter>
<name>Condition</name>
<value>Used</value>
</itemFilter>
<keywords>&quot;princess cut&quot;, &quot;diamond ring&quot;, -&quot;14k*&quot;</keywords>
<sortOrder>PricePlusShippingHighest</sortOrder>
</findCompletedItemsRequest>

缩进不好也没关系。很明显,过滤器就在那里。

由于我没有API密钥,我不能自己运行它,但我很确定它会起作用。

最新更新