亚马逊联盟API Java代码转C# .NET Core出错,求AWSV4Auth替代方案
解决亚马逊PAAPI5 C#签名及代码错误问题
错误原因分析
- 找不到
AWSV4Auth:这是Java生态专属的签名实现类,C#中无对应命名空间,需替换为C#生态的AWS签名方案。 - 解构变量类型无法推断:原代码中
header集合的类型不支持解构语法,需改用常规键值对遍历方式。
解决方案
步骤1:安装依赖NuGet包
在项目中安装以下两个包:
AWSSDK.Core:AWS官方提供的签名工具包Newtonsoft.Json:用于JSON序列化与解析
步骤2:修正后的完整代码
using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Amazon.Runtime; using Amazon.Runtime.Signing; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace AmazonPaApiDemo { class Program { // 替换为你的凭证与配置 private const string ACCESS_KEY = "你的AWS Access Key"; private const string SECRET_KEY = "你的AWS Secret Key"; private const string HOST = "webservices.amazon.co.uk"; private const string URI_PATH = "/paapi5/searchitems"; private const string REGION = "eu-west-1"; private const string PARTNER_TAG = "你的联盟PartnerTag"; static async Task Main(string[] args) { // 构造请求Payload(用匿名对象避免字符串拼接错误) var requestPayload = new { Keywords = "yoshi", Resources = new[] { "Images.Primary.Medium", "ItemInfo.Title", "Offers.Listings.Condition", "Offers.Listings.Price", "Offers.Listings.Link" // 新增联盟链接字段 }, ItemCount = 1, PartnerTag = PARTNER_TAG, PartnerType = "Associates", Marketplace = "www.amazon.co.uk" }; string payloadJson = JsonConvert.SerializeObject(requestPayload); // 基础请求头 var baseHeaders = new Dictionary<string, string> { {"Content-Type", "application/json; charset=UTF-8"}, {"X-Amz-Target", "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems"}, {"Host", HOST} }; // 使用AWS官方SDK生成V4签名 var signer = new AWS4Signer(); var credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY); var signingResult = signer.SignRequest( new HttpRequestMessage(HttpMethod.Post, $"https://{HOST}{URI_PATH}"), credentials, "ProductAdvertisingAPI", REGION, payloadJson, baseHeaders ); // 发送请求并处理响应 using (var httpClient = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Post, $"https://{HOST}{URI_PATH}"); request.Content = new StringContent(payloadJson, Encoding.UTF8, "application/json"); // 添加签名后的请求头 foreach (var kvp in signingResult.SignedHeaders) { if (!request.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value)) { request.Content.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value); } } var response = await httpClient.SendAsync(request); var jsonResponse = await response.Content.ReadAsStringAsync(); var statusCode = (int)response.StatusCode; Console.WriteLine(jsonResponse); if (statusCode == 200) { Console.WriteLine("成功获取Product Advertising API响应"); // 解析目标字段 var json = JObject.Parse(jsonResponse); var targetItem = json["SearchResult"]["Items"]?[0]; if (targetItem != null) { string title = targetItem["ItemInfo"]["Title"]["DisplayValue"]?.ToString(); string imageUrl = targetItem["Images"]["Primary"]["Medium"]["URL"]?.ToString(); string price = targetItem["Offers"]["Listings"]?[0]["Price"]["DisplayAmount"]?.ToString(); string condition = targetItem["Offers"]["Listings"]?[0]["Condition"]["DisplayValue"]?.ToString(); string affiliateLink = targetItem["Offers"]["Listings"]?[0]["Link"]?.ToString(); Console.WriteLine($"标题: {title}"); Console.WriteLine($"图片链接: {imageUrl}"); Console.WriteLine($"价格: {price}"); Console.WriteLine($"商品状态: {condition}"); Console.WriteLine($"联盟链接: {affiliateLink}"); } } else { var errorJson = JObject.Parse(jsonResponse); if (errorJson.ContainsKey("Errors")) { var errorArray = errorJson["Errors"] as JArray; foreach (var error in errorArray) { Console.WriteLine($"错误代码: {error["Code"]}, 错误信息: {error["Message"]}"); } } else { Console.WriteLine("错误代码: InternalFailure, 错误信息: 请求处理失败,原因是未知错误、异常或故障,请重试"); } } } } } }
关键修改说明
- 替换签名实现:用AWS官方的
AWS4Signer替代Java的AWSV4Auth,实现标准AWS V4签名流程。 - 修复遍历语法:将解构遍历改为
foreach (var kvp in signingResult.SignedHeaders),通过kvp.Key和kvp.Value访问键值对。 - 优化Payload构造:用匿名对象+JSON序列化替代字符串拼接,避免引号转义错误。
- 补充联盟链接字段:在
Resources数组中添加Offers.Listings.Link,确保获取联盟推广链接。
内容的提问来源于stack exchange,提问作者CrazyLegs
相关产品推荐
相关产品推荐

