如何解决亚马逊产品广告api-项目查找请求工作示例
| 有人会举一个亚马逊ITEMLOOKUP
的工作示例吗?
我有以下代码,但它似乎不起作用:
string ISBN = \"0393326381\";
string ASIN = \"\";
if (!(string.IsNullOrEmpty(ISBN) && string.IsNullOrEmpty(ASIN)))
{
AWSECommerceServicePortTypeChannel service = new AWSECommerceServicePortTypeChannel();
ItemLookup lookup = new ItemLookup();
ItemLookupRequest request = new ItemLookupRequest();
lookup.AssociateTag = secretKey;
lookup.AWSAccessKeyId = accessKeyId;
if (string.IsNullOrEmpty(ASIN))
{
request.IdType = ItemLookupRequestIdType.ISBN;
request.ItemId = new string[] { ISBN.Replace(\"-\",\"\") };
}
else
{
request.IdType = ItemLookupRequestIdType.ASIN;
request.ItemId = new string[] { ASIN };
}
request.ResponseGroup = new string[] { \"OfferSummary\" };
lookup.Request = new ItemLookupRequest[] { request };
response = service.ItemLookup(lookup);
if (response.Items.Length > 0 && response.Items[0].Item.Length > 0)
{
Item item = response.Items[0].Item[0];
if (item.MediumImage == null)
{
//bookImageHyperlink.Visible = false;
}
else
{
//bookImageHyperlink.ImageUrl = item.MediumImage.URL;
}
//bookImageHyperlink.NavigateUrl = item.DetailPageURL;
//bookTitleHyperlink.Text = item.ItemAttributes.Title;
//bookTitleHyperlink.NavigateUrl = item.DetailPageURL;
if (item.OfferSummary.LowestNewPrice == null)
{
if (item.OfferSummary.LowestUsedPrice == null)
{
//priceHyperlink.Visible = false;
}
else
{
//priceHyperlink.Text = string.Format(\"Buy used {0}\",item.OfferSummary.LowestUsedPrice.FormattedPrice);
//priceHyperlink.NavigateUrl = item.DetailPageURL;
}
}
else
{
//priceHyperlink.Text = string.Format(\"Buy new {0}\",item.OfferSummary.LowestNewPrice.FormattedPrice);
//priceHyperlink.NavigateUrl = item.DetailPageURL;
}
if (item.ItemAttributes.Author != null)
{
//authorLabel.Text = string.Format(\"By {0}\",string.Join(\",\",item.ItemAttributes.Author));
}
else
{
//authorLabel.Text = string.Format(\"By {0}\",item.ItemAttributes.Creator.Select(c => c.Value).ToArray()));
}
/*
ItemLink link = item.ItemLinks.Where(i => i.Description.Contains(\"Wishlist\")).FirstOrDefault();
if (link == null)
{
//wishListHyperlink.Visible = false;
}
else
{
//wishListHyperlink.NavigateUrl = link.URL;
}
* */
}
}
}
问题是这样的:
这应该以不同的方式定义,但我不知道AWSECommerceServicePortTypeChannel服务= new AWSECommerceServicePortTypeChannel();
解决方法
说,这些代码看起来很熟悉。从端点切换到要求您添加消息签名的过程中,您就缺少了端点签名。您需要在客户端上添加行为。这是上面代码的更改:
if (!(string.IsNullOrEmpty(ISBN) && string.IsNullOrEmpty(ASIN)))
{
AWSECommerceServicePortTypeClient client = new AWSECommerceServicePortTypeClient();
client.ChannelFactory.Endpoint.Behaviors.Add(
new Amazon.AmazonSigningEndpointBehavior(
accessKeyId,secretKey);
ItemLookup lookup = new ItemLookup();
ItemLookupRequest request = new ItemLookupRequest();
lookup.AssociateTag = accessKeyId;
lookup.AWSAccessKeyId = secretKey;
//... etc.
这是端点(我对此不以为然,我希望我能记得谁应该这样做):
namespace Amazon
{
public class AmazonSigningEndpointBehavior : IEndpointBehavior {
private string accessKeyId = \"\";
private string secretKey = \"\";
public AmazonSigningEndpointBehavior(string accessKeyId,string secretKey) {
this.accessKeyId = accessKeyId;
this.secretKey = secretKey;
}
public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint,ClientRuntime clientRuntime) {
clientRuntime.MessageInspectors.Add(new AmazonSigningMessageInspector(accessKeyId,secretKey));
}
public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint,EndpointDispatcher endpointDispatcher) { return; }
public void Validate(ServiceEndpoint serviceEndpoint) { return; }
public void AddBindingParameters(ServiceEndpoint serviceEndpoint,BindingParameterCollection bindingParameters) { return; }
}
}
哦。并且您需要MessageInspector才能正常工作。
namespace Amazon
{
public class AmazonSigningMessageInspector : IClientMessageInspector {
private string accessKeyId = \"\";
private string secretKey = \"\";
public AmazonSigningMessageInspector(string accessKeyId,string secretKey) {
this.accessKeyId = accessKeyId;
this.secretKey = secretKey;
}
public object BeforeSendRequest(ref Message request,IClientChannel channel) {
// prepare the data to sign
string operation = Regex.Match(request.Headers.Action,\"[^/]+$\").ToString();
DateTime now = DateTime.UtcNow;
string timestamp = now.ToString(\"yyyy-MM-ddTHH:mm:ssZ\");
string signMe = operation + timestamp;
byte[] bytesToSign = Encoding.UTF8.GetBytes(signMe);
// sign the data
byte[] secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
HMAC hmacSha256 = new HMACSHA256(secretKeyBytes);
byte[] hashBytes = hmacSha256.ComputeHash(bytesToSign);
string signature = Convert.ToBase64String(hashBytes);
// add the signature information to the request headers
request.Headers.Add(new AmazonHeader(\"AWSAccessKeyId\",accessKeyId));
request.Headers.Add(new AmazonHeader(\"Timestamp\",timestamp));
request.Headers.Add(new AmazonHeader(\"Signature\",signature));
return null;
}
public void AfterReceiveReply(ref Message reply,object correlationState) { }
}
}
最后,标题:
namespace Amazon
{
public class AmazonHeader : MessageHeader
{
private string name;
private string value;
public AmazonHeader(string name,string value)
{
this.name = name;
this.value = value;
}
public override string Name { get { return name; } }
public override string Namespace { get { return \"http://security.amazonaws.com/doc/2007-01-01/\"; } }
protected override void OnWriteHeaderContents(XmlDictionaryWriter xmlDictionaryWriter,MessageVersion messageVersion)
{
xmlDictionaryWriter.WriteString(value);
}
}
}
是的,当他们开始需要消息签名时,它们使事情变得复杂了。
, nuget提供了一个简单易用的库。
PM> Install-Package Nager.AmazonProductAdvertising
例
var authentication = new AmazonAuthentication();
authentication.AccessKey = \"accesskey\";
authentication.SecretKey = \"secretkey\";
var wrapper = new AmazonWrapper(authentication,AmazonEndpoint.DE);
var result = wrapper.Lookup(\"0393326381\",AmazonResponseGroup.OfferSummary);
, 要对ASIN以外的任何内容执行查找,您需要指定\“ SearchIndex \”属性。您可以简单地将其设置为\“ All \”。
var request = new ItemLookupRequest();
request.ItemId = new[] {upcCode};
request.IdType = ItemLookupRequestIdType.UPC;
request.IdTypeSpecified = true;
request.SearchIndex = \"All\";
这是文档的链接:http://docs.amazonwebservices.com/AWSECommerceService/2011-08-01/DG/index.html?ItemLookup.html。请注意SearchIndex参数的描述:
约束:如果ItemIdis为ASIN,则无法在以下位置指定搜索索引
请求。非ASIN ItemIds必需。
, 我实际上在它周围构建了一个小包装,因此它可以使您获得方便的对象图。我在BitBucket上找到了源代码,在C#Amazon ItemLookup页面上有更多有关它的信息。
C#Amazon ItemLookup
您可以拨打以下电话:
var item = client.LookupByAsin(\"B0037X9N5U\");
double? price = item.GetLowestPrice();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。