Amazon平台SP-API的SDK包生成和使用详解

目前包含了卖家授权Token、受限数据Token、订单Orders、财务Finances、FBA库存FBAInventory、Feed批处理、创建并上传文档和下载并解压文档、Report报告、上传商品等模块的SDK包。(2.0版本)

介绍下我当时对接亚马逊平台API时生成SDK包的一些操作,给需要用到的同学一些指引. 文章后面附带有已生成的SDK包的下载链接,大家可直接下载使用。若有疑问可私信或留言交流。

各位小伙伴,如果觉得该文章对你有帮助,请帮忙点个赞,谢谢。

生成SDK的官方文档介绍:
https://developer-docs.amazon.com/sp-api/docs/generating-a-java-sdk-with-lwa-token-exchange-and-authentication
按照官方文档的说明,一步步操作:

  1. 本地环境安装jdk、maven、wget(已安装过的请忽略);
  2. 进入官方源码项目selling-partner-api-models,将项目源码下载到本地(项目源码链接:https://github.com/amzn/selling-partner-api-models)。我是放在桌面(C:\Users\administer\Desktop\selling-partner-api-models-main);
  3. 下载Swagger代码生成器(可使用Wget命令:wget https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.13/swagger-codegen-cli-2.4.13.jar -O swagger-codegen-cli.jar);
  4. 在C盘根目录新建文件夹SwaggerToCL, 将下载的swagger-codegen-cli.jar复制到该文件夹中.如果jar包名称不同注意改名(C:\SwaggerToCL\swagger-codegen-cli.jar);

一、生成授权Token的SDK(2.0版本)

  1. 打包:进入目录 C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java,从此处进入cmd命令行窗口(或者先打开cmd命令行窗口再切换路径), 执行 mvn package 命令打包。
  2. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的sellingpartnerapi-aa-java-2.0-jar-with-dependencies.jar。若有,则进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartnerapi-aa-java-2.0-jar-with-dependencies.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=sellingpartnerapi-aa-java -Dversion=2.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\sellingpartnerapi-aa-java\2.0\sellingpartnerapi-aa-java-2.0.jar)。
  3. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellingpartnerapi-aa-java</artifactId>
    <version>2.0</version>
    </dependency>
  4. 代码调用: 官方文档:https://developer-docs.amazon.com/sp-api/docs/connecting-to-the-selling-partner-api-using-a-generated-java-sdk

示例代码: AmazonRequest 主要是一些公共参数。 如clientId,clientSecret,refreshToken,endpoint等等

public class AmazonRequest {
	/** Your LWA client identifier */
	private String clientId;
	/** Your LWA client secret */
	private String clientSecret;
	/** The LWA refresh token */
	private String refreshToken;
	/** The LWA authentication server URI */
	private String endpoint;

	/** 是否GrantlessOperation */
	private boolean isGrantlessOperation;
	/** 速率限制 */
	private Double rateLimitPermit;
}

public class AmazonConfig {

	// 正式环境token地址
	private static final String PROD_TOKEN_URL = "https://api.amazon.com/auth/o2/token";

	/**
	 *  Configure your LWA credentials(not grantless operations)
	 *
	 * @param request
	 * @return
	 */
	public static LWAAuthorizationCredentials getLWAAuthorizationCredentials4NotGrantlessOperation(AmazonRequest request) {
        return LWAAuthorizationCredentials.builder()
				.clientId(request.getClientId())
				.clientSecret(request.getClientSecret())
				.refreshToken(request.getRefreshToken())
				.endpoint(PROD_TOKEN_URL)
				.build();
	}

	/**
	 *  Configure your LWA credentials(grantless operations)
	 *
	 * @param request
	 * @return
	 */
	public static LWAAuthorizationCredentials getLWAAuthorizationCredentials4GrantlessOperation(AmazonRequest request) {
        return LWAAuthorizationCredentials.builder()
				.clientId(request.getClientId())
				.clientSecret(request.getClientSecret())
				.withScopes(ScopeConstants.SCOPE_NOTIFICATIONS_API, ScopeConstants.SCOPE_MIGRATION_API)
				.endpoint(PROD_TOKEN_URL)
				.build();
	}

	/**
	 * Configure your LWA credentials
	 *
	 * @param request
	 * @return
	 */
	public static LWAAuthorizationCredentials getLWAAuthorizationCredentials(AmazonRequest request) {
		if (request.isGrantlessOperation()) { // 是无授权操作
			return getLWAAuthorizationCredentials4GrantlessOperation(request);
		} else { // 非无授权操作
			return getLWAAuthorizationCredentials4NotGrantlessOperation(request);
		}
	}

二、生成订单Orders的SDK

  1. 复制文件:进入项目目录 C:\Users\administer\Desktop\selling-partner-api-models-main,选择models文件夹并进入, 找到订单项目的文件夹orders-api-model,进入文件夹将 ordersV0.json 文件复制到 C:\SwaggerToCL。(C:\Users\administer\Desktop\selling-partner-api-models-main\models\orders-api-model)

  2. 生成项目代码:进入目录 C:\SwaggerToCL ,进入cmd, 执行命令通过Swagger代码生成器生成Order项目(java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\ordersV0.json -l java -t C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\SellerOrders_JavaCL),可以看到新生成的订单项目文件夹SellerOrders_JavaCL。

  3. 添加依赖:进入目录C:\SwaggerToCL\SellerOrders_JavaCL,在pom.xml文件中添加依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellingpartnerapi-aa-java</artifactId>
    <version>2.0</version>
    </dependency>

  4. 修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开SellerOrders_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.sellerorders. 并启动项目跑一下,将编译错误的问题处理掉.

  5. 打包:进入目录 C:\SwaggerToCL\SellerOrders_JavaCL,进入cmd, 执行 mvn package 命令打包。

  6. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的swagger-java-client-1.0.0.jar。若有,则改jar名为:sellingpartnerapi-aa-java-sellerorders-1.0.0.jar。 然后进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartnerapi-aa-java-sellerorders-1.0.0.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=sellerorders -Dversion=1.0.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\sellerorders\1.0.0\sellerorders-1.0.0.jar)。

  7. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellerorders</artifactId>
    <version>1.0.0</version>
    </dependency>

  8. 代码调用: 官方文档:https://developer-docs.amazon.com/sp-api/docs/connecting-to-the-selling-partner-api-using-a-generated-java-sdk

示例代码:


	/**
	 * 获取速率限制配置
	 *
	 * @param request
	 * @return
	 */
	public static RateLimitConfiguration getRateLimitConfiguration (AmazonRequest request) {
        return RateLimitConfigurationOnRequests.builder()
				.rateLimitPermit(request.getRateLimitPermit())
				.waitTimeOutInMilliSeconds(30000L)
				.build();
	}
	
	/**
	 *  Create an instance of the Orders API and call an operation
	 *
	 * @param request
	 * @return
	 */
	public static OrdersV0Api getOrdersApiInstance(AmazonRequest request) {
        return new OrdersV0Api.Builder()
				.lwaAuthorizationCredentials(getLWAAuthorizationCredentials(request))
				.rateLimitConfigurationOnRequests(getRateLimitConfiguration(request))
				.endpoint(request.getEndpoint())
				.build();
	}

	/**
	 * 获取订单列表(getOrders)
	 * 请求速率: 默认0.0167/s;最大请求数:20
	 *
	 * @param request
	 * @return
	 */
	 // 部分示例代码
     public List<Order> getOrders(AmazonGetOrdersRequest request) {
	    double permitsPerSecond = 0.0167;
    	request.setRateLimitPermit(permitsPerSecond);
	
		OrdersV0Api apiInstance = AmazonConfig.getOrdersApiInstance(request);
		ApiResponse<GetOrdersResponse> apiResponse = apiInstance.getOrdersWithHttpInfo(marketplaceIds, null, null, lastUpdatedAfter, lastUpdatedBefore, null, fulfillmentChannels, null, null, null, maxResultsPerPage, null, null, nextToken, amazonOrderIds, null, null, null, null, null, null, null);
     }

    /**
     * 获取订单(getOrder)
     * 请求速率: 默认0.5/s;最大请求数:30
     *
     * @param request
     * @return
     */
     // 部分示例代码
     public Order getOrder(AmazonGetOrderRequest request) {
		double permitsPerSecond = 0.5;
     	request.setRateLimitPermit(permitsPerSecond);
     
	    OrdersV0Api apiInstance = AmazonConfig.getOrdersApiInstance(request);
    	ApiResponse<GetOrderResponse> apiResponse = apiInstance.getOrderWithHttpInfo(request.getOrderId());
     }
     
	/**
	 * 获取订单明细列表
	 * 请求速率: 默认0.5/s;最大请求数:30
	 *
	 * @param request
	 * @param orderId
	 * @return
	 */
	 // 部分示例代码
	 public List<OrderItem> getOrderItems(AmazonRequest request, String orderId) {
	 	double permitsPerSecond = 0.5;
        request.setRateLimitPermit(permitsPerSecond);
	
		OrdersV0Api apiInstance = AmazonConfig.getOrdersApiInstance(request);
		ApiResponse<GetOrderItemsResponse> apiResponse = apiInstance.getOrderItemsWithHttpInfo(orderId, nextToken);
	 }

三、生成财务Finances的SDK

操作流程和生成订单Orders的SDK相同,只是目录地址及项目文件夹不同。

  1. 复制文件:进入目录C:\Users\administer\Desktop\selling-partner-api-models-main\models, 找到财务项目的文件夹finances-api-model,进入文件夹将 financesV0.json文件复制到 C:\SwaggerToCL。(C:\Users\administer\Desktop\selling-partner-api-models-main\models\finances-api-model)

  2. 生成项目代码:进入目录 C:\SwaggerToCL ,进入cmd, 执行命令通过Swagger代码生成器生成财务项目(java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\financesV0.json -l java -t C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\Finances_JavaCL),可以看到新生成的财务项目文件夹Finances_JavaCL。

  3. 添加依赖:进入目录C:\SwaggerToCL\Finances_JavaCL,在pom.xml文件中添加依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellingpartnerapi-aa-java</artifactId>
    <version>2.0</version>
    </dependency>

  4. 修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开Finances_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.finances. 并启动项目跑一下,将编译错误的问题处理掉.

  5. 打包:进入目录 C:\SwaggerToCL\Finances_JavaCL,进入cmd, 执行 mvn package 命令打包。

  6. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的swagger-java-client-1.0.0.jar。若有,则改jar名为:sellingpartnerapi-aa-java-finances-1.0.0.jar。然后进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartnerapi-aa-java-finances-1.0.0.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=finances -Dversion=1.0.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\finances\1.0.0\finances-1.0.0.jar)。

  7. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>finances</artifactId>
    <version>1.0.0</version>
    </dependency>

  8. 代码调用: 示例代码:

	/**
	 *  Create an instance of the Finances API and call an operation
	 *
	 * @param request
	 * @return
	 */
	public static DefaultApi getFinancesApiInstance(AmazonRequest request) {
        return new DefaultApi.Builder()
				.lwaAuthorizationCredentials(getLWAAuthorizationCredentials(request))
				.rateLimitConfigurationOnRequests(getRateLimitConfiguration(request))
				.endpoint(request.getEndpoint())
				.build();
	}

	/**
	 * 获取财务数据列表
	 * 请求速率: 默认0.5/s;最大请求数:30
	 *
	 * @param request
	 * @return
	 */
	double permitsPerSecond = 0.5;
	request.setRateLimitPermit(permitsPerSecond);
	
	DefaultApi apiInstance = AmazonConfig.getFinancesApiInstance(request);
	ListFinancialEventsResponse response = apiInstance.listFinancialEvents(maxResultsPerPage, postedAfter, postedBefore, nextToken);

四、生成FBA库存FBAInventory的SDK

操作流程和生成订单Orders的SDK相同,只是目录地址及项目文件夹不同。

  1. 复制文件:同订单流程: fba-inventory-api-model,fbaInventory.json

  2. 生成项目代码:(java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\fbaInventory.json -l java -t C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\FbaInventory_JavaCL)。

  3. 添加依赖:进入目录C:\SwaggerToCL\FbaInventory_JavaCL,在pom.xml文件中添加依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellingpartnerapi-aa-java</artifactId>
    <version>2.0</version>
    </dependency>

  4. 修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开FbaInventory_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.fbainventory. 并启动项目跑一下,将编译错误的问题处理掉.

  5. 打包:同订单流程。

  6. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的swagger-java-client-1.0.0.jar。则改jar名为:sellingpartnerapi-aa-java-fbainventory-1.0.0.jar。 然后进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartnerapi-aa-java-fbainventory-1.0.0.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=fbainventory -Dversion=1.0.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\fbainventory\1.0.0\fbainventory-1.0.0.jar)。

  7. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>fbainventory</artifactId>
    <version>1.0.0</version>
    </dependency>

  8. 代码调用: 示例代码:

	/**
	 *  Create an instance of the FbaInventory API and call an operation
	 *
	 * @param request
	 * @return
	 */
	public static FbaInventoryApi getFbaInventorysApiInstance(AmazonGetFbaInventorysRequest request) {
		return new FbaInventoryApi.Builder()
				.lwaAuthorizationCredentials(getLWAAuthorizationCredentials(request))
				.rateLimitConfigurationOnRequests(getRateLimitConfiguration(request))
				.endpoint(request.getEndpoint())
				.build();
	}
	
	/**
	 * 获取FBA库存列表
	 * 请求速率: 默认2/s;最大请求数:2
	 *
	 * @param request
	 * @return
	 */
	double permitsPerSecond = 2;
	request.setRateLimitPermit(permitsPerSecond);
	
	FbaInventoryApi apiInstance = AmazonConfig.getFbaInventorysApiInstance(request);
	GetInventorySummariesResponse response = apiInstance.getInventorySummaries(granularityType, granularityId, marketplaceIds, details, startDateTime, sellerSkus, null, nextToken);

五、生成批处理Feed的SDK

操作流程和生成订单Orders的SDK相同,只是目录地址及项目文件夹不同。

  1. 复制文件:同订单流程: feeds-api-model,feeds_2021-06-30.json

  2. 生成项目代码:(java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\feeds_2021-06-30.json -l java -t C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\Feeds_20210630_JavaCL)。

  3. 添加依赖:进入目录C:\SwaggerToCL\Feeds_20210630_JavaCL,在pom.xml文件中添加依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>sellingpartnerapi-aa-java</artifactId>
    <version>2.0</version>
    </dependency>

  4. 修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开Feeds_20210630_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.feeds. 并启动项目跑一下,将编译错误的问题处理掉.

  5. 打包:同订单流程。

  6. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的swagger-java-client-1.0.0.jar。则改jar名为:sellingpartnerapi-aa-java-feeds_20210630-1.0.0.jar。然后进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartnerapi-aa-java-feeds_20210630-1.0.0.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=feeds_20210630 -Dversion=1.0.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\feeds_20210630\1.0.0\feeds_20210630-1.0.0.jar)。

  7. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>feeds_20210630</artifactId>
    <version>1.0.0</version>
    </dependency>

  8. 代码调用: 示例代码:

	/**
	 *  Create an instance of the Feeds API and call an operation
	 *
	 * @param request
	 * @return
	 */
	public static FeedsApi getFeedsApiInstance(AmazonRequest request) {
		return new FeedsApi.Builder()
				.lwaAuthorizationCredentials(getLWAAuthorizationCredentials(request))
				.rateLimitConfigurationOnRequests(getRateLimitConfiguration(request))
				.endpoint(request.getEndpoint())
				.build();
	}
	
	/**
	 * 创建Feed文档
	 * 请求速率: 默认0.5/s;最大请求数:15
	 *
	 * @param request
	 * @param contentType
	 * @return
	 */
	private CreateFeedDocumentResponse createFeedDocument(AmazonRequest request, String contentType) {
		CreateFeedDocumentSpecification body = new CreateFeedDocumentSpecification();
		body.setContentType(contentType);

		double permitsPerSecond = 0.5;
		request.setRateLimitPermit(permitsPerSecond);
		try {
			FeedsApi apiInstance = AmazonConfig.getFeedsApiInstance(request);
			return apiInstance.createFeedDocument(body);
		} catch (io.swagger.client.feeds.ApiException e) {
			throw new RuntimeException(e.getCode() + ": " + e.getResponseBody());
		}
	}

	/**
	 * 创建Feed
	 * 请求速率: 默认0.0083/s;最大请求数:15
	 *
	 * @param request
	 * @param feedType
	 * @param marketplaceIdList
	 * @param inputFeedDocumentId
	 * @param feedOptions
	 * @return
	 */
	private CreateFeedResponse createFeed(AmazonRequest request, String feedType, List<String> marketplaceIds, String inputFeedDocumentId, FeedOptions feedOptions) {
		CreateFeedSpecification body = new CreateFeedSpecification();
		body.setFeedType(feedType);
		body.setMarketplaceIds(marketplaceIds);
		body.setInputFeedDocumentId(inputFeedDocumentId);
		body.setFeedOptions(feedOptions);

		double permitsPerSecond = 0.0083;
		request.setRateLimitPermit(permitsPerSecond);
		try {
			FeedsApi apiInstance = AmazonConfig.getFeedsApiInstance(request);
			return apiInstance.createFeed(body);
		} catch (io.swagger.client.feeds.ApiException e) {
			throw new RuntimeException(e.getCode() + ": " + e.getResponseBody());
		}
	}
	
	/**
	 * 获取Feed(仅提供过去 90 天内创建的Feed请求的信息)
	 * 请求速率: 默认2.0/s;最大请求数:15
	 *
	 * @param request
	 * @return
	 */
	public Feed getFeed(AmazonSPGetFeedRequest request) {
		double permitsPerSecond = 2.0;
		request.setRateLimitPermit(permitsPerSecond);
		try {
			FeedsApi apiInstance = AmazonConfig.getFeedsApiInstance(request);
			return apiInstance.getFeed(request.getFeedId());
		} catch (io.swagger.client.feeds.ApiException e) {
			throw new RuntimeException(e.getCode() + ": " + e.getResponseBody());
		}
	}
	
	/**
	 * 获取Feed文档
	 * 请求速率: 默认0.0222/s;最大请求数:10
	 *
	 * @param request
	 * @return
	 */
	public FeedDocument getFeedDocument(AmazonSPGetFeedDocumentRequest request) {
		double permitsPerSecond = 0.0222;
		request.setRateLimitPermit(permitsPerSecond);
		try {
			FeedsApi apiInstance = AmazonConfig.getFeedsApiInstance(request);
			return apiInstance.getFeedDocument(request.getFeedDocumentId());
		} catch (io.swagger.client.feeds.ApiException e) {
			throw new RuntimeException(e.getCode() + ": " + e.getResponseBody());
		}
	}

六、生成上传和下载并解压文档的SDK

操作流程和生成订单Orders的SDK流程略有不同。

  1. 打包:进入目录 C:\Users\administer\Desktop\selling-partner-api-models-main,选择clients文件夹并进入,找到项目文件夹sellingpartner-api-documents-helper-java进入。从此处进入cmd, 执行 mvn package 命令打包。
    (如果打包报错test部分,在其pom.xml文件中<artifactId>maven-surefire-plugin</artifactId>下添加<configuration><skipTests>true</skipTests></configuration>,然后再重新打包。)
  2. 安装:打包成功无报错后,进入target文件夹 ,查看是否有新生成的完整的sellingpartner-api-documents-helper-java-1.0.0.jar。若有,则改jar名为:sellingpartner-api-documents-helper-java-1.0.0.jar。 然后进入cmd执行命令在本地 Maven 存储库中安装。
    (命令:mvn install:install-file -Dfile=sellingpartner-api-documents-helper-java-1.0.0.jar -DgroupId=com.amazon.sellingpartnerapi -DartifactId=documents-helper -Dversion=1.0.0 -Dpackaging=jar)。安装成功后,在本地maven仓库中对应目录下就能看到该sdk包了(如:C:\Users\administer\.m2\repository\com\amazon\sellingpartnerapi\documents-helper\1.0.0\documents-helper-1.0.0.jar)。
  3. 添加依赖:在对应项目的pom.xml中添加maven依赖:
    <dependency>
    <groupId>com.amazon.sellingpartnerapi</groupId>
    <artifactId>documents-helper</artifactId>
    <version>1.0.0</version>
    </dependency>
  4. 代码调用: 示例代码:
    /**
     * 上传XML类型的Feed文件
     *
     * @param url
     * @param content
     * @param contentType
     */
    public void uploadXMLFeed(String url, String content, String contentType) {
        OkHttpClient client = new OkHttpClient();
        try {
            Request request = new Request.Builder()
                    .url(url)
                    .put(RequestBody.create(MediaType.parse(contentType), content.getBytes(StandardCharsets.UTF_8)))
                    .build();

            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) {
                throw new RuntimeException(String.format("Call to upload document failed with response code: %d and message: %s", response.code(), response.message()));
            }
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    
    /**
     * 上传JSON类型的Feed文件
     *
     * @param url
     * @param json
     * @param contentType
     */
    public void uploadJSONFeed(String url, String json, String contentType) {
        OkHttpClient client = new OkHttpClient();
        try {
            Request request = new Request.Builder()
                    .url(url)
                    .put(RequestBody.create(MediaType.parse(contentType), json.getBytes(StandardCharsets.UTF_8)))
                    .build();

            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) {
                throw new RuntimeException(String.format("Call to upload document failed with response code: %d and message: %s", response.code(), response.message()));
            }
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 下载并解压
     *
     * @param url
     * @param compressionAlgorithm
     * @return
     */
    public String downloadAndDecompress(String url, String compressionAlgorithm) {
        OkHttpClient httpclient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();

        StringBuilder sbf = new StringBuilder();
        try {
            Response response = httpclient.newCall(request).execute();
            if (!response.isSuccessful()) {
                throw new RuntimeException(String.format("Call to download content was unsuccessful with response code: %d and message: %s", response.code(), response.message()));
            }

            try (ResponseBody responseBody = response.body()) {
                String contentType = response.header("Content-Type");
                MediaType mediaType = MediaType.parse(contentType);
                Charset charset = mediaType.charset();
                if (charset == null) {
                    charset = StandardCharsets.UTF_8;
                }

                Closeable closeThis = null;
                try {
                    InputStream inputStream = responseBody.byteStream();
                    closeThis = inputStream;

                    if ("GZIP".equals(compressionAlgorithm)) {
                        inputStream = new GZIPInputStream(inputStream);
                        closeThis = inputStream;
                    }

                    // This example assumes that the download content has a charset in the content-type header, e.g.
                    // text/plain; charset=UTF-8
                    if ("text".equals(mediaType.type())) {
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, charset);
                        closeThis = inputStreamReader;

                        BufferedReader reader = new BufferedReader(inputStreamReader);
                        closeThis = reader;

                        String line;
                        do {
                            line = reader.readLine();
                            // Process line by line.
                            if (line != null) {
                                sbf.append(line);
                                sbf.append("\n");
                            }
                        } while (line != null);
                    } else {
                        //Handle content with binary data/other media types here.
                        throw new RuntimeException(String.format("Unsupported media type: %s/%s", mediaType.type(), mediaType.subtype()));
                    }
                } finally {
                    if (closeThis != null) {
                        closeThis.close();
                    }
                }
            }
        } catch (IOException | IllegalArgumentException e) {
            throw new RuntimeException(e.getMessage());
        }
        return sbf.toString();
    }

	/**
	 * 上传Feed文档内容
	 *
	 * @param url
	 * @param feedContent
	 * @param contentType
	 * @return
	 */
	public String uploadFeedDocument(String url, String feedContent, String contentType) {
		try {
			uploadXMLFeed(url, feedContent, contentType);
			return null;
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
	}

	/**
	 * 下载并解压报告文档
	 *
	 * @param url
	 * @param compressionAlgorithm
	 * @return
	 */
	public String downloadAndDecompressReportDocument(String url, String compressionAlgorithm) {
		try {
			return downloadAndDecompress(url, compressionAlgorithm);
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
	}

七、创建Feed文档与上传的组合使用示例

代码调用: 示例代码:

	String contentType = "text/xml; charset=UTF-8";
	String feedType = "POST_ORDER_FULFILLMENT_DATA"; // TODO 示例,可按需要自行调整
	
	try {
			// 1.调用 createFeedDocument 操作,为您提交的Feed指定内容类型
			CreateFeedDocumentResponse createFeedDocumentResponse =	createFeedDocument(request, contentType);
			if (null != createFeedDocumentResponse) {
				String feedDocumentId = createFeedDocumentResponse.getFeedDocumentId();
				String url = createFeedDocumentResponse.getUrl();

				// 2.上传Feed文档内容到上一步中的URL
				String errorMsg = uploadFeedDocument(url, feedContent, contentType);
				if (StringUtils.isNotBlank(errorMsg)) { // 上传错误
					throw new RuntimeException(errorMsg);
				}

				// 3.调用 createFeed 操作
				CreateFeedResponse createFeedResponse = createFeed(request, feedType, marketplaceIdList, feedDocumentId, null);
				if (null != createFeedResponse) {
					String feedId = createFeedResponse.getFeedId();
					// TODO 此处写自己的业务处理逻辑,比如将数据返回并存储等,方便后续通过feedId获取处理结果.
					return XXX;
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
		return null;

八、已生成好的SDK包(可直接下载使用)

各位小伙伴,如果觉得该文章对你有帮助,请帮忙点个赞,谢谢。

SDK资源下载链接(https://download.csdn.net/download/weixin_42567205/87435724)
SDK网盘下载链接(https://pan.baidu.com/s/1_de4cd3PqxmeP8Z-omNiOg?pwd=e6de)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

事在wo为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值