我正在查看ItemLookupRequest
有一个选项可以使用标记页对结果集进行分页,但在WSDL中没有标记页选项。我遇到的问题是项目查找只返回10个结果。如何在不使用tagpage选项的情况下浏览结果集
非常感谢您的帮助
我的目标是将一个ISBN传递给亚马逊,并收到该书正在销售的所有价格。看起来我只能收到10个随机价格。如果他们将我的退货限制在10个价格,并且不让我进行某种形式的分页
根据ItemId文档,每个请求最多只能指定10个唯一的ItemId。因此,看起来他们每个请求的阈值是每个ItemLookupRequest请求最多返回10个项目。我已经有一段时间没有使用这个API了,但当我使用它时,他们极力要求你缓存产品信息,除了尽可能激进的定价。这可能是他们通过API设计强制客户端缓存的方式之一。
项目ID
唯一标识项目的一个或多个(最多十个)正整数。数字的含义由IdType指定。也就是说,如果IdType是ASIN,则ItemId值是ASIN。如果ItemId是ASIN,则无法在请求中指定搜索索引。
类型:字符串
默认值:无
限制:必须是有效的项目ID。对于多个ID,请使用最多包含十个ID的逗号分隔列表。
亚马逊网络服务代码可能很难导航。在查看您发布到ItemLookupRequest的链接时,您是否尝试过此链接(从请求参数中提取)?
RelatedItemPage:此可选参数仅在使用RelatedItems响应组时有效。每个ItemLookup请求最多可以返回十个相关项目。RelatedItemPage值指定要返回的十个相关项的集合。例如,值2返回第二组10个相关项
您可以使用ItemPage参数迭代ItemSearchResult的页面,并使用"排序"参数对项目进行排序(而不是"随机";这实际上是最"相关"的)。
这是我刚刚拼凑的一个未经测试的狙击坑,我以前没有做过,但应该有效。你需要做比我在这里做的更多的错误处理,还需要满足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();
}