如何将ItemFilters与eBay :: API :: Simple :: Finding一起使用?

时间:2017-01-07 13:36:08

标签: perl ebay-api

我正在使用eBay::API::Simple::Finding从ebay获取已售商品,我想使用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();

非常感谢任何帮助,

至于我所看到的? 排序正常,按关键字搜索正在运行,但是项目过滤器无法正常工作,因此返回新的&已使用过的物品,无论是已售出还是未售出

1 个答案:

答案 0 :(得分:2)

阅读eBay API docs about findCompletedItems表明您需要为ItemFilter使用子元素。有a sample可以很好地显示(link)

<?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>

查看eBay::API::Simple::Finding模块的源代码,我们可以看到它使用XML::Simple来构造请求。虽然一般不鼓励XML::Simple,但我们必须使用它。

深入了解ItemFilter的文档,我们可以为每个过滤器提供一个<itemFilter>块。这意味着多个被自动视为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模块调用。我没有直接执行调用,而是编写了它,然后调用private method _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>

它并不重要&#39;没有很好地缩进。很明显,过滤器就在那里。

由于我没有API密钥,因此我无法自行运行,但我确信它可以正常运行。