代码之家  ›  专栏  ›  技术社区  ›  YosiFZ

c#Amazon Api请求失败

  •  0
  • YosiFZ  · 技术社区  · 8 年前

    我正在尝试创建一个HTTP url请求,以通过其ASIN数组获取Amazon项目。出于同样的原因,我在Objective-c代码中使用了相同的代码,它工作得非常好。

    但每次我尝试访问chrome中的url时,都会收到这样的消息:

    我们计算的请求签名与您提供的签名不匹配。检查您的AWS机密访问密钥和签名方法。有关详细信息,请参阅维修文档。

    这是我正在使用的代码:

    private void GetFinalUrlForAsinArray(ArrayList asinArr)
    {
        String timeStamp = GetTimeStamp();
    
        String amazonAPIUrl = "http://webservices.amazon.com/onca/xml?";
    
        ArrayList param = new ArrayList();
        param.Add("AWSAccessKeyId=myawsaccesskeyid");
    
        param.Add("AssociateTag=myassociatetag");
    
        param.Add("IdType=ASIN");
        param.Add(string.Join(",", asinArr.ToArray()));
        param.Add("Operation=ItemLookup");
        param.Add("ResponseGroup=ItemAttributes,Offers");
        param.Add("Service=AWSECommerceService");
        param.Add(String.Format("Timestamp={0}", timeStamp));
    
        amazonAPIUrl += string.Join("&", param.ToArray());
    
        string queryString = new System.Uri(amazonAPIUrl).Query;
        var queryDictionary = HttpUtility.ParseQueryString(queryString);
    
        ArrayList queryItemsNew = new ArrayList();
        foreach (var query in queryDictionary)
        {
            String name = HttpUtility.UrlEncode((string)query);
            String value = HttpUtility.UrlEncode((string)queryDictionary.Get((string)query));
            queryItemsNew.Add(String.Format("{0}={1}", name,value));
        }
    
        String path = string.Join("&", queryItemsNew.ToArray());
    
        String finalPath = String.Format("GET\nwebservices.amazon.com\n/onca/xml\n{0}",path);
    
        string signature = HmacSha256Digest(finalPath);
    
        String finalUrl = String.Format("http://webservices.amazon.com/onca/xml?{0}&Signature={1}", path, signature);
    }
    
    private String GetTimeStamp()
    {
        DateTime d = DateTime.UtcNow;
        String str = d.ToString("yyyy-MM-dd''T''HH:mm:ss''Z''");
    
        return str;
    }
    
    private static string HmacSha256Digest(string message)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        HMACSHA256 hmac = new HMACSHA256(encoding.GetBytes(mysecret));
        string signature = Convert.ToBase64String(hmac.ComputeHash(encoding.GetBytes(message)));
        String sigEncoded = Uri.EscapeDataString(signature);
        return sigEncoded;
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Mark Rawson    8 年前

    查看了API文档后,您似乎错过了此处的ItemId键:

    param.Add(string.Join(",", asinArr.ToArray()));
    

    我猜你的意思是:

    param.Add("ItemId=" + string.Join(",", asinArr.ToArray()));
    

    在其他方面,它看起来符合规范,我注意到的另一件事是该示例的URL编码为大写,即%3A,而不是C默认值%3A。