2017-12-23 5 views
0

ASINアレイでAmazonアイテムを取得するためのHTTP URLリクエストを作成しようとしています。同じ理由でObjective-Cコードに同じコードを使用していますが、それは完全に機能しています。c#AmazonのApiリクエストが失敗しました

しかし、私は私のクロムのURLにアクセスしようとするこのmesseage毎回取得しています:私たちは計算要求署名は、あなたが提供するシグネチャが一致しない

を。 AWSシークレットアクセスキーと署名方法を確認してください。詳細については、サービスマニュアルを参照してください。

これは私が使用しているコードです:

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

私は:

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

'ArrayList'は.NET 2.0がリリースされたときに廃止されました。あなたは 'string []'または 'List 'を使用する必要があります –

+0

あなたは.NET用AWS SDKを使用していない理由はありますか? https://aws.amazon.com/sdk-for-net/ –

答えて

2

は、ここでのItemIdキーを見逃しているように見えるAPIドキュメントを見ていたましたあなたがそれを意味すると思います:

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

それ以外の場合はcこの仕様では、他の唯一の例は、URLエンコードが大文字、つまりC#のデフォルトの%3aではなく%3Aであるという例でした。

関連する問題