亚马逊 spapi — 生成 Java SDK
这篇我们参考亚马逊提供的开发文档 Generating a Java SDK with LWA token exchange and authentication 来生成SPAPI(Amazon Selling Partner API)的 Java SKD,使用SDK可以调用SPAPI的相关接口,开发自己的应用对接亚马逊平台,实现订单、履约、支付等待功能。
selling-partner-api-models
从 Github - amzn/selling-partner-api-models 下载SPAPI源码。selling-partner-api-models/clients/ 目录下有API SDK(Application Programming Interface,Software Development Kit)共用的依赖,重点关注 sellingpartner-api-aa-java(认证授权模块) 和 sellingpartner-api-documents-helper-java(API文档助手模块)。认证授权模块负责鉴权,现成的代码,只需要提供必要的参数;API文档助手模块提供了文档上传下载的代码,文档安全传输相关的加解密操作也是现成的,我们只需要使用里面现成的工具类即可,调用一些API的时候会用到。
selling-partner-api-models/models/ 目录下是各模块的API配置文件(.json),这个在官网的开发文档也可以看到,比如 Sellers API v1 model。打开 Swagger Editor,将配置文件中的内容贴到左边的编辑框里可视化API定义的内容。
使用 Swagger Codegen 生成代码
我们下载 Swagger 代码生成器(Swagger Codegen),用于根据API配置文件生成SDK代码。
echo "下载 swagger-codegen-cli-2.4.13.jar 到 ~/IdeaProjects 目录下" > /dev/null
wget https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.13/swagger-codegen-cli-2.4.13.jar -O ~/IdeaProjects/swagger-codegen-cli.jar
以上面图中卖家账户接口的API配置(sellers.json)为例,我们使用Swagger Codegen Cli生成卖家账户接口的API SDK代码。
echo "使用 swagger-codegen-cli.jar 根据 Sellers.json 和 templates 目录中的代码模板生成 Java SDK 代码到 ~/IdeaProjects/spapi/sellers 目录下" > /dev/null
java -jar ~/IdeaProjects/swagger-codegen-cli.jar \
generate -i ~/IdeaProjects/selling-partner-api-models-main/models/sellers-api-model/Sellers.json \
-l java \
-t ~/IdeaProjects/selling-partner-api-models-main/clients/sellingpartner-api-aa-java/resources/swagger-codegen/templates/ \
-o ~/IdeaProjects/spapi/sellers
API SDK代码结构
使用IDEA打开这个项目看下代码结构,可以按自己需求选择作为Maven或者Gradle项目打开,里面两种类型的配置文件都有。
/docs
目录下是接口相关的文档,内容比较简陋,不如直接看官网的文档,比如 Sellers API v1 reference;
io.swagger.client.api
包下是API的入口类,里面定义了各个接口的调用方法,直接用就行。每个接口会定义多种方式,比如:以 Async
结尾的异步调用,需要实现回调接口;以 WithHttpInfo
结尾的方法会返回统一响应体 ApiResponse
等等。
io.swagger.client.model
是这个模块的API特有的一些实体类,比如请求响应体。
io.swagger.client.auth
和下图红框中的对象是通用的,每个模块生成代码的时候都会有,我们将多个模块的代码合到一起的时候可以共用。
添加API SDK需要的依赖
我们再回头看看 io.swagger.client.api
中的 SellerApi
会发现有依赖的类(比如:AWSAuthenticationCredentials
)找不到,导致编译报错了,报错代码是生成的建造者模式(Builder)代码,设置鉴权相关的属性的。如果生成代码的时候,不通过下面这段脚本指定使用的模板,那就不会生成 Builder 代码,没有依赖报错。不过还是用模板比较好,因为最终调用接口的时候还是要设置鉴权相关属性的,用生成的 Builder 代码比较方便。
-t ~/IdeaProjects/selling-partner-api-models-main/clients/sellingpartner-api-aa-java/resources/swagger-codegen/templates/
报错的依赖都在 selling-partner-api-models/clients/sellingpartner-api-aa-java/src/com/amazon/SellingPartnerAPIAA/ 中。
通过打包配置依赖的方式解决
开发文档的例子 是将 sellingpartner-api-aa-java 模块打包生成依赖给API SDK使用,在IDEA的 Maven 窗口中,找到对应的 sellingpartnerapi-aa-java
模块,双击 install
安装这个依赖。
然后在API SDK配置这个依赖,重新加载下报错就消失了。如果公司有自己的 Maven 仓库,还可以将这个发布到仓库中,这样就不需要每个人都在本地安装一遍了。
将依赖代码复制到API SDK中
我们也可以将里面的类直接复制到API SDK中,因为都是一些简单的对象。
从 sellingpartner-api-aa-java 将 src 下连包带代码整个复制到API SDK中,并添加 sellingpartnerapi-aa-java
中需要的而这边没有的依赖,Maven 重新加载即可。
最佳实践
以上是SDK生成的全部过程,这里我们再看下较为合理的实践方式。
先创建个项目,将 sellingpartnerapi-aa-java 和 sellingpartner-api-documents-helper-java 两个模块整个复制到项目中。
然后创建子模块(比如:fruitbasket-amazon-spapi-models)用于存放生成的代码。
我们将复制过来的 sellingpartnerapi-aa-java 和 sellingpartner-api-documents-helper-java 作为依赖配置到子模块中(如下图红框)。
然后将我们生成的代码复制到子模块中。黄色框外是通用的代码,复制一份进来就可以了;黄色框中是根据不同模块的API配置文件(.json)生成的,我们适当的分下包。
最后只需要将生成的代码中的依赖配置文件指定的依赖添加到这个子模块的配置文件中,有很多依赖其实已经在 sellingpartnerapi-aa-java 和 sellingpartner-api-documents-helper-java 中有配置,可以省略。
另外生成的代码都在 io.swagger.client
包下,可以根据自己的需求改这个包名,复制代码进来的时候跟着改下即可。
到此本文的内容都已分享完毕,祝大家顺利。