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
按照官方文档的说明,一步步操作:
- 本地环境安装jdk、maven、wget(已安装过的请忽略);
- 进入官方源码项目selling-partner-api-models,将项目源码下载到本地(项目源码链接:https://github.com/amzn/selling-partner-api-models)。我是放在桌面(C:\Users\administer\Desktop\selling-partner-api-models-main);
- 下载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);
- 在C盘根目录新建文件夹SwaggerToCL, 将下载的swagger-codegen-cli.jar复制到该文件夹中.如果jar包名称不同注意改名(C:\SwaggerToCL\swagger-codegen-cli.jar);
一、生成授权Token的SDK(2.0版本)
- 打包:进入目录 C:\Users\administer\Desktop\selling-partner-api-models-main\clients\sellingpartner-api-aa-java,从此处进入cmd命令行窗口(或者先打开cmd命令行窗口再切换路径), 执行 mvn package 命令打包。
- 安装:打包成功无报错后,进入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)。 - 添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellingpartnerapi-aa-java</artifactId>
<version>2.0</version>
</dependency> - 代码调用: 官方文档: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
-
复制文件:进入项目目录 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)
-
生成项目代码:进入目录 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。
-
添加依赖:进入目录C:\SwaggerToCL\SellerOrders_JavaCL,在pom.xml文件中添加依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellingpartnerapi-aa-java</artifactId>
<version>2.0</version>
</dependency> -
修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开SellerOrders_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.sellerorders. 并启动项目跑一下,将编译错误的问题处理掉.
-
打包:进入目录 C:\SwaggerToCL\SellerOrders_JavaCL,进入cmd, 执行 mvn package 命令打包。
-
安装:打包成功无报错后,进入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)。 -
添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellerorders</artifactId>
<version>1.0.0</version>
</dependency> -
代码调用: 官方文档: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相同,只是目录地址及项目文件夹不同。
-
复制文件:进入目录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)
-
生成项目代码:进入目录 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。
-
添加依赖:进入目录C:\SwaggerToCL\Finances_JavaCL,在pom.xml文件中添加依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellingpartnerapi-aa-java</artifactId>
<version>2.0</version>
</dependency> -
修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开Finances_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.finances. 并启动项目跑一下,将编译错误的问题处理掉.
-
打包:进入目录 C:\SwaggerToCL\Finances_JavaCL,进入cmd, 执行 mvn package 命令打包。
-
安装:打包成功无报错后,进入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)。 -
添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>finances</artifactId>
<version>1.0.0</version>
</dependency> -
代码调用: 示例代码:
/**
* 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相同,只是目录地址及项目文件夹不同。
-
复制文件:同订单流程: fba-inventory-api-model,fbaInventory.json
-
生成项目代码:(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)。
-
添加依赖:进入目录C:\SwaggerToCL\FbaInventory_JavaCL,在pom.xml文件中添加依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellingpartnerapi-aa-java</artifactId>
<version>2.0</version>
</dependency> -
修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开FbaInventory_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.fbainventory. 并启动项目跑一下,将编译错误的问题处理掉.
-
打包:同订单流程。
-
安装:打包成功无报错后,进入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)。 -
添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>fbainventory</artifactId>
<version>1.0.0</version>
</dependency> -
代码调用: 示例代码:
/**
* 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相同,只是目录地址及项目文件夹不同。
-
复制文件:同订单流程: feeds-api-model,feeds_2021-06-30.json
-
生成项目代码:(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)。
-
添加依赖:进入目录C:\SwaggerToCL\Feeds_20210630_JavaCL,在pom.xml文件中添加依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>sellingpartnerapi-aa-java</artifactId>
<version>2.0</version>
</dependency> -
修改包路径: 为防止因和其他项目生成的SDK包中的类名和包路径均相同导致的调用冲突, 此时用IDE开发工具打开Feeds_20210630_JavaCL项目,将 io.swagger.client 修改为 io.swagger.client.feeds. 并启动项目跑一下,将编译错误的问题处理掉.
-
打包:同订单流程。
-
安装:打包成功无报错后,进入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)。 -
添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>feeds_20210630</artifactId>
<version>1.0.0</version>
</dependency> -
代码调用: 示例代码:
/**
* 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流程略有不同。
- 打包:进入目录 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>,然后再重新打包。) - 安装:打包成功无报错后,进入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)。 - 添加依赖:在对应项目的pom.xml中添加maven依赖:
<dependency>
<groupId>com.amazon.sellingpartnerapi</groupId>
<artifactId>documents-helper</artifactId>
<version>1.0.0</version>
</dependency> - 代码调用: 示例代码:
/**
* 上传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)