You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对接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的自定义服务

  1. 进入Strapi项目的src/api目录,创建一个新的API(比如命名为amazon-product),或者在现有API下新增服务文件。
  2. 安装PAAPI SDK或HTTP请求库,比如运行:
    npm install amazon-paapi5-sdk
    
  3. 在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;
        }
      }
    };
    
  4. 在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;
      }
    }));
    
  5. 进入Strapi后台,给这个API配置权限(比如允许公共访问,或设置JWT权限限制调用方)。

步骤3:在Gatsby中调用Strapi接口获取数据

  1. 安装Gatsby的Strapi数据源插件:
    npm install gatsby-source-strapi
    
  2. 在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: [],
          },
        },
      ],
    };
    
  3. 创建商品展示页面,比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:20:17