对接On-request Reports API
- 1、对接指南
- 1.1 报告生成时间
- 1.2 报告保留期
- 1.3 请求限制
- 1.4 报告请求工作流
- 如何申请报告
- 第 1 步:申请取消报告
- 第 2 步:获取报表可用性状态
- 第 3 步:下载报告 URL
- 2、代码实现
- 2.1、获取访问API的token
- 2.2、构建公共请求方法
- 2.3 编写demo测试创建报告API
1、对接指南
1.1 报告生成时间
请求报告后,需要 15 到 45 分钟才能生成,然后可供下载。
1.2 报告保留期
您请求的报告将保留 30 天。您可以使用报告的请求 ID 请求 30 天的报告,无需请求新的报告。
1.3 请求限制
您每小时可以为每种报告类型请求一份报告。虽然您可以同时请求多种报告类型,但每小时只能为每种报告类型发出一次请求。
1.4 报告请求工作流
- 使用 创建报告请求 API 创建报告请求。对于每个请求,系统都会创建一个
requestId
,卖家可以使用该 ID 来跟踪所请求报告的状态。 - 使用报告请求状态 API 检查报告请求提交状态,该 API 返回有关报告状态的所有详细信息。
报表状态为READY
后,您现在可以使用下载报表 URL API 下载报表。 - (可选): 您还可以使用获取所有报告请求 API 获取所有报告请求的列表。
- (可选):如果使用创建订阅 API设置通知:当您收到报告已准备就绪的通知时,可以使用下载报表 URL API 检索它以供下载。
如何申请报告
第 1 步:申请取消报告
若要请求项目报告,请调用创建报告请求 API。
例如,调用v3/reports/reportRequests?reportType=REPORT-TYPE&reportVersion=v1
将REPORT-TYPE
替换为您需要请求的报告类型。
指定所有必需参数的值:
reportType
– 指定您要请求的报告(例如 reportType=CANCELLATION)。
reportVersion
– 指定报告版本(例如 reportVersion=v1)。
成功后,API 调用将返回一个 requestId
,您可以使用它来了解报告是否已准备好下载,以及请求的状态(例如 RECEIVED或 INPROGRESS)。它还返回requestSubmissionDate
, UTC 格式的值:YYYY-MM-DDTHH:mm:ssZ。
您还可以设置通知,以便在报告状态为 READY
时触发。要设置通知,请参阅通知。
第 2 步:获取报表可用性状态
若要了解报告是否已准备好下载,请调用报告请求状态 API 以检索报告请求状态。当状态为READY
时,您可以下载报告。API 只能检索过去 30 天内创建的请求的详细信息。
例如,使用requestId
进行调用。v3/reports/reportRequests?{requestId}
成功后,此调用将检索指定requestId
的状态(例如 SUBMITTED、INPROGRESS、READY 或 ERROR)。
第 3 步:下载报告 URL
若要下载请求的报告,请调用下载报告 URL API”,并指定“由报告状态通知发送”或从报告请求状态 API 调用发送的“链接”。requestID
例如,调用/v3/reports/downloadReport?requestId={requestId}
成功后,您将收到用于下载报告的 URL 以及 URL 过期时间:
downloadURL– 用于下载报告的 URL。downloadURLExpirationTime– 下载 URL 过期时间。
为避免错误,请务必检查以下情况是否不适用于您的请求:
请求已过期。在这种情况下,报告不再可用。
如果报告尚不可用,请检查状态是否为INPROGRESS。
可能是系统错误或数据错误。
如果 无效。请确保您拥有正确的 requestId
,或者它在 30 天后仍未过期。
2、代码实现
2.1、获取访问API的token
public static String getAccessToken(String appKey, String appSecret) {String authorization = getAuthorization(appKey, appSecret);Map<String, String> headers = new HashMap<>();headers.put("Authorization", authorization);headers.put("WM_SVC.NAME", "Shop name");headers.put("WM_QOS.CORRELATION_ID", IdUtil.randomUUID());HttpResponse response = HttpRequest.post("https://marketplace.walmartapis.com/v3/token").addHeaders(headers).body("grant_type=client_credentials", "application/x-www-form-urlencoded").execute();JSONObject jsonObject = JSONUtil.parseObj(response.body());return jsonObject.getStr("access_token");}
2.2、构建公共请求方法
public static String request(Method method,String url,Map<String, Object> paramMap,String jsonBody) {String appkey = "xxxxxx-xxxxxxxx8cb";String appSecret = "AOqxxxxxxxxxxxxxxxxxxxxxxbo";String accessToken = getAccessToken(appkey, appSecret);//appkey和appSecret换成自己的Map<String, String> headers = getHeaders(method, accessToken);// get请求拼接参数if (paramMap != null && paramMap.size() > 0) {if (url.indexOf("?") > 0) {url = url + "&" + HttpUtil.toParams(paramMap);} else {url = url + "?" + HttpUtil.toParams(paramMap);}}HttpResponse resp;if (method == Method.POST) {resp = HttpRequest.post(url).addHeaders(headers).body(jsonBody).execute();} else if (method == Method.GET) {resp = HttpRequest.get(url).addHeaders(headers).execute();} else {String msg = "仅支持GET 和POST请求";log.error(msg);return msg;}if (HttpStatus.HTTP_OK == resp.getStatus()) {log.info("接口响应数据response.body():{}", resp.body());return resp.body();} else {log.error("调用Walmart API 错误");return "调用Walmart API 错误";}}
2.3 编写demo测试创建报告API
public static void main(String[] args) {String url = "https://marketplace.walmartapis.com/v3/reports/reportRequests";Map<String, Object> param = new HashMap<>();param.put("reportType", "ITEM");param.put("reportVersion", "v4");//1、把你想要展示到报告中的字段都可以往里面写//字段网址:https://developer.walmart.com/doc/us/mp/us-mp-onrequestreports/List<String> columns = Arrays.asList("SKU", "Item ID", "Product Name","Price", "Lifecycle Status", "Publish Status", "Status Change Reason","Average Rating", "Shelf Name");//2、添加过滤条件,这里以过滤 Publish Status = PUBLISHED为例子JSONObject statusFilter = new JSONObject();statusFilter.set("type", "enumFilter").set("columnName", "Publish Status").set("values", new String[]{"PUBLISHED"});//2.1、如果要过滤其他条件自行添加。比如过滤 10<=price<=1000JSONObject priceFilter = new JSONObject();priceFilter.set("type", "rangeFilter").set("columnName", "Price").set("from", "10").set("to", "1000");//2.2、把上面所有filter放到filters集合JSONArray rowsFilters = new JSONArray();rowsFilters.add(statusFilter);rowsFilters.add(priceFilter);//3、构建body参数,把字段和过滤条件加进来JSONObject jsonBody = new JSONObject();jsonBody.set("excludeColumns", columns);jsonBody.set("rowFilters", rowsFilters);log.info("请求参数:{}" + jsonBody);String response = request(Method.POST, url, param, JSONUtil.toJsonStr(jsonBody));log.info("response:{}", response);}
创建报告API调用成功,返回requestId