代码之家  ›  专栏  ›  技术社区  ›  Arsene Wenger

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

  •  2
  • Arsene Wenger  · 技术社区  · 8 年前

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

    (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();
    

    非常感谢任何帮助,

    至于我看到了什么? 排序正在工作,按关键字搜索正在工作,但itemfilters不工作,因此它返回新的&已完成的二手物品,无论是已售出还是未售出

    1 回复  |  直到 8 年前
        1
  •  2
  •   Borodin    8 年前

    阅读 eBay API docs about findCompletedItems 显示需要将子元素用于 ItemFilter s、 有 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> 每个过滤器的块。这意味着多个被视为自动的。

    要以在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>
    

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

    因为我没有API密钥,所以我不能自己运行它,但我非常确定它会工作。