如何对接Amazon Product Advertising API与Strapi,在Gatsby站点展示指定分类商品?
可以将Amazon Product Advertising API与Strapi对接并在Gatsby展示吗?
当然可以。Strapi作为无头CMS,支持通过自定义服务或插件对接外部API,你可以用它拉取、处理Amazon PAAPI的商品数据,再提供给Gatsby调用展示。以下是具体操作步骤:
步骤1:准备Amazon PAAPI凭证
- 先在亚马逊开发者平台申请PAAPI的
Access Key和Secret Key,同时关联你的亚马逊联盟账号,获取Partner Tag(联盟ID)。 - 确定目标商品分类对应的
SearchIndex值(可通过亚马逊分类导航或PAAPI官方文档查找,比如电子产品对应Electronics)。
步骤2:在Strapi中编写对接PAAPI的自定义服务
- 进入Strapi项目的
src/api目录,创建一个新的API(比如命名为amazon-product),或者在现有API下新增服务文件。 - 安装PAAPI SDK或HTTP请求库,比如运行:
npm install amazon-paapi5-sdk - 在
src/api/amazon-product/services/amazon-product.js中编写拉取逻辑:const AmazonPaapi5Sdk = require('amazon-paapi5-sdk'); const defaultClient = AmazonPaapi5Sdk.ApiClient.instance; // 替换为你的PAAPI凭证 const accessKey = '你的Access Key'; const secretKey = '你的Secret Key'; const partnerTag = '你的Partner Tag'; const marketplace = 'www.amazon.com'; // 根据目标地区调整,比如英国站用www.amazon.co.uk defaultClient.accessKey = accessKey; defaultClient.secretKey = secretKey; const api = new AmazonPaapi5Sdk.DefaultApi(); const request = new AmazonPaapi5Sdk.SearchItemsRequest(); request['PartnerTag'] = partnerTag; request['PartnerType'] = 'Associates'; request['Marketplace'] = marketplace; request['SearchIndex'] = 'Electronics'; // 替换为目标分类 request['ItemCount'] = 10; // 单次拉取的商品数量 // 指定需要获取的商品字段,按需添加 request['Resources'] = ['ItemInfo.Title', 'ItemInfo.Features', 'Images.Primary.Large', 'Offers.Listings.Price', 'DetailPageURL']; module.exports = { async getAmazonProducts() { try { const response = await api.searchItems(request); // 格式化返回数据,提取需要的字段 return response.SearchResult.Items.map(item => ({ title: item.ItemInfo.Title.DisplayValue, features: item.ItemInfo.Features?.DisplayValues || [], imageUrl: item.Images.Primary.Large.URL, price: item.Offers.Listings[0].Price.DisplayAmount, amazonUrl: item.DetailPageURL })); } catch (error) { console.error('PAAPI调用失败:', error); throw error; } } }; - 在
src/api/amazon-product/controllers/amazon-product.js中创建控制器,暴露API接口:const { createCoreController } = require('@strapi/strapi').factories; module.exports = createCoreController('api::amazon-product.amazon-product', ({ strapi }) => ({ async find(ctx) { const products = await strapi.service('api::amazon-product.amazon-product').getAmazonProducts(); ctx.body = products; } })); - 进入Strapi后台,给这个API配置权限(比如允许公共访问,或设置JWT权限限制调用方)。
步骤3:在Gatsby中调用Strapi接口获取数据
- 安装Gatsby的Strapi数据源插件:
npm install gatsby-source-strapi - 在
gatsby-config.js中配置Strapi源:module.exports = { plugins: [ { resolve: `gatsby-source-strapi`, options: { apiURL: process.env.STRAPI_API_URL || 'http://localhost:1337', accessToken: process.env.STRAPI_TOKEN, // 如果Strapi设置了权限,填写对应Token collectionTypes: ['amazon-product'], // 对应Strapi中创建的API类型 singleTypes: [], }, }, ], }; - 创建商品展示页面,比如
src/pages/amazon-products.js:import React from 'react'; import { graphql } from 'gatsby'; export const query = graphql` query { allStrapiAmazonProduct { nodes { title features imageUrl price amazonUrl } } } `; const AmazonProductsPage = ({ data }) => { const products = data.allStrapiAmazonProduct.nodes; return ( <div style={{ maxWidth: 1200, margin: '0 auto', padding: '20px' }}> <h1>亚马逊商品列表</h1> <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: '20px' }}> {products.map((product, idx) => ( <div key={idx} style={{ border: '1px solid #eee', padding: '15px', borderRadius: '8px' }}> <img src={product.imageUrl} alt={product.title} style={{ width: '100%', height: 200, objectFit: 'contain' }} /> <h3 style={{ fontSize: 16, margin: '10px 0' }}>{product.title}</h3> <ul style={{ paddingLeft: 20, marginBottom: 10 }}> {product.features.slice(0,3).map((f, i) => <li key={i} style={{ fontSize: 14 }}>{f}</li>)} </ul> <p style={{ fontSize: 18, fontWeight: 'bold', margin: '10px 0' }}>{product.price}</p> <a href={product.amazonUrl} target="_blank" rel="noopener noreferrer" style={{ display: 'inline-block', padding: '8px 16px', backgroundColor: '#ff9900', color: 'white', textDecoration: 'none', borderRadius: '4px' }} > 查看详情 </a> </div> ))} </div> </div> ); }; export default AmazonProductsPage;
关键注意事项
- PAAPI调用限制:亚马逊对PAAPI有调用次数限额,建议在Strapi中添加缓存逻辑(比如用Redis或Strapi自带缓存),避免频繁调用触发限制。
- 定时更新数据:可以安装
strapi-plugin-scheduler插件,设置定时任务定期拉取最新商品数据,保证内容时效性。 - 权限安全:如果不需要公开Strapi接口,一定要配置JWT权限,只允许Gatsby服务调用。
内容的提问来源于stack exchange,提问作者Ipsita Rout
相关产品推荐
相关产品推荐

