Я использую Google AdWords WSDL и мыло.
Я обнаружил, что порядок элементов xml важен.
Вот мой объект запроса:
const reportDef: IReportDefinition = {
// order is matter
dateRangeType: _.get(reportDefinition, 'dateRangeType', ReportDefinition.DateRangeType.ALL_TIME),
selector: {
fields: CampaignPerformanceReportService.selectorFields,
},
reportName: CampaignPerformanceReportService.reportName,
reportType: ReportDefinition.ReportType.CAMPAIGN_PERFORMANCE_REPORT,
};
И, используя xml2js
builder, преобразуйте этот объект в XML
:
const builder = new xml2js.Builder();
builder.buildObject(obj);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportDefinition>
<dateRangeType>YESTERDAY</dateRangeType>
<selector>
<fields>CampaignId</fields>
<fields>CampaignName</fields>
<fields>CampaignStatus</fields>
<fields>StartDate</fields>
<fields>EndDate</fields>
<fields>Clicks</fields>
<fields>Conversions</fields>
<fields>Ctr</fields>
<fields>Cost</fields>
<fields>Impressions</fields>
<fields>ConversionRate</fields>
<fields>AverageCpc</fields>
</selector>
<reportName>Campaign Performance Report</reportName>
<reportType>CAMPAIGN_PERFORMANCE_REPORT</reportType>
<downloadFormat>XML</downloadFormat>
</reportDefinition>
Затем отправьте этот запрос, но получили ошибку:
StatusCodeError: 400 - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><reportDownloadError><ApiError><type>ReportDownloadError.INVALID_REPORT_DEFINITION_XML</type><trigger>Invalid ReportDefinition Xml: cvc-complex-type.2.4.a: Invalid content was found starting with element '{\"https://adwords.google.com/api/adwords/cm/v201809\":dateRangeType}'. One of '{\"https://adwords.google.com/api/adwords/cm/v201809\":id, \"https://adwords.google.com/api/adwords/cm/v201809\":selector}' is expected.</trigger><fieldPath></fieldPath></ApiError></reportDownloadError>"
Когда я ставлю поле dataRangeType
до последнего. Как:
const reportDef: IReportDefinition = {
// order is matter
selector: {
fields: CampaignPerformanceReportService.selectorFields,
},
reportName: CampaignPerformanceReportService.reportName,
reportType: ReportDefinition.ReportType.CAMPAIGN_PERFORMANCE_REPORT,
dateRangeType: _.get(reportDefinition, 'dateRangeType', ReportDefinition.DateRangeType.ALL_TIME),
};
Преобразованный XML
- это:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportDefinition>
<selector>
<fields>CampaignId</fields>
<fields>CampaignName</fields>
<fields>CampaignStatus</fields>
<fields>StartDate</fields>
<fields>EndDate</fields>
<fields>Clicks</fields>
<fields>Conversions</fields>
<fields>Ctr</fields>
<fields>Cost</fields>
<fields>Impressions</fields>
<fields>ConversionRate</fields>
<fields>AverageCpc</fields>
</selector>
<reportName>Campaign Performance Report</reportName>
<reportType>CAMPAIGN_PERFORMANCE_REPORT</reportType>
<dateRangeType>YESTERDAY</dateRangeType>
<downloadFormat>XML</downloadFormat>
</reportDefinition>
Тогда я могу получить правильный ответ:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<report>
<report-name name='Campaign Performance Report'/>
<date-range date='May 22, 2019'/>
</report>
Итак, как мне решить проблему с порядком элементов xml? Я не знаю, в каком порядке должен быть элемент xml. Я должен попытаться отсортировать свойства снова и снова.
Это лучший способ справиться с этим?