亚马逊Web服务通过结果集进行分页

时间:2012-03-13 14:19:56

标签: c# amazon-web-services

我正在浏览ItemLookupRequest

可以选择使用标记页来浏览结果集,但在WSDL中没有标记页选项。我遇到的问题是 Itemlookup只返回10个结果。如何在不使用标签页选项的情况下翻阅结果集?

非常感谢你的帮助

我的目标是将ISBN传递给亚马逊并获得该书所售出的所有价格。看起来我只能收到10个随机价格。如果他们将我的回报限制在10个价格而不让我做某种形式的分页,我怎么能得到所有的价格

3 个答案:

答案 0 :(得分:0)

根据ItemId文档,每个请求最多只能指定10个唯一的ItemIds。因此,对于每个ItemLookupRequest请求,每个请求最多可返回10个项目。自从我使用这个API以来已经有一段时间了,但是当我使用它时,他们正在努力推动您尽可能积极地缓存除定价之外的产品信息。这可能是它们迫使客户端通过其API设计进行缓存的方式之一。

项目Id
唯一标识项目的一个或多个(最多十个)正整数。数字的含义由IdType指定。也就是说,如果IdType是ASIN,则ItemId值是ASIN。如果ItemIdis是ASIN,则无法在请求中指定搜索索引。

类型:字符串

默认值:无

约束:必须是有效的商品ID。对于多个ID,请使用最多包含十个ID的逗号分隔列表。

答案 1 :(得分:0)

亚马逊网络服务代码可能很难导航。在查看您发布到ItemLookupRequest的链接时,您是否尝试过此链接(从请求参数中提取)?

RelatedItemPage :此可选参数仅在使用RelatedItems响应组时有效。每个ItemLookup请求最多可以返回十个相关项。 RelatedItemPage值指定要返回的十个相关项的集合。例如,值2返回第二组十个相关项

答案 2 :(得分:0)

您可以使用ItemPage参数迭代ItemSearchResult的页面,并使用“Sort”参数对项目进行排序(而不是“随机”;这实际上是最“相关”)。

这是一个我刚刚一起扔的未经测试的snippit,而不是我之前做过的事情,但是应该有效。您需要执行比我在此处所做的更多错误处理,并且还要满足AWS对您施加的每秒最大请求数量:

    private List<Item> testAWS() {

        var s = new AWSECommerceServicePortTypeClient("AWSECommerceServicePortUK");
        s.ChannelFactory.Endpoint.Behaviors.Add(new AmazonSigningEndpointBehavior(AWSAccessKey, AWSSecureKeyID));

        var totalPages = 10; // Default value - changes on first iteration
        var books = new List<Item>();

        for(var i = 1; i < totalPages; i++) {
            var req = new ItemSearchRequest {
                SearchIndex = "Books",
                ItemPage = i.ToString(CultureInfo.InvariantCulture),
                Keywords = "Your ISBN", // There may be a better way to search for an ISBN - I haven't yet needed to
                Sort = "price", // Sort depends on which endpoint you are searching.
                Availability = ItemSearchRequestAvailability.Available, // Gets available products (mainly)
                ResponseGroup = new[] { "Small" } // Change for more details
            };

            var search = new ItemSearch {
                AWSAccessKeyId = AWSAccessKey,
                AssociateTag = AWSAssociateTag,
                Request = new[] { req }
            };

            var response = s.ItemSearch(search);
            // Store response in a list or something, which you can reorder as you want
            books.AddRange(response.Items[0].Item);

            totalPages = int.Parse(response.Items[0].TotalPages ?? "0");
        }

        // return your books, ordered by price ascending
        return books.OrderBy(b => b.Offers.Offer[0].OfferListing[0].Price.Amount).ToList();

    }