NetSuite SuiteTalk API 中 searchMoreWithId 操作的结果为空页

Posted

技术标签:

【中文标题】NetSuite SuiteTalk API 中 searchMoreWithId 操作的结果为空页【英文标题】:Empty page in result of searchMoreWithId operation in NetSuite SuiteTalk API 【发布时间】:2019-10-01 16:54:49 【问题描述】:

我遇到了与NetSuite SuiteTalk API 集成的问题。他们提供 SOAP API 以管理 ERP 的记录/实体。我们通过search 调用和随后的searchMoreWithId 调用导入一些记录(库存项目)。

我们为search 呼叫和接收search_id 的响应提供条件。搜索结果可能很大,因此我们使用单独的searchMoreWithId 调用获取结果的每一页,同时指定searchIdpageIndex。 NetSuite SuiteTalk API 文档 - https://docs.oracle.com/cloud/latest/netsuitecs_gs/NSTWP/NSTWP.pdf.

问题是searchMoreWithId 的一些调用返回empty 记录列表。

此类响应与空白页面的示例:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header>
        <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2016_2.platform.webservices.netsuite.com">
          <platformMsgs:nsId>WEBSERVICES...</platformMsgs:nsId>
        </platformMsgs:documentInfo>
      </soapenv:Header>
      <soapenv:Body>
        <searchMoreWithIdResponse xmlns="urn:messages_2016_2.platform.webservices.netsuite.com">
          <platformCore:searchResult xmlns:platformCore="urn:core_2016_2.platform.webservices.netsuite.com">
            <platformCore:status isSuccess="true"/>
            <platformCore:totalRecords>98852</platformCore:totalRecords>
            <platformCore:pageSize>10</platformCore:pageSize>
            <platformCore:totalPages>9886</platformCore:totalPages>
            <platformCore:pageIndex>66</platformCore:pageIndex>
            <platformCore:searchId>WEBSERVICES_...</platformCore:searchId>
            <platformCore:recordList/>
          </platformCore:searchResult>
        </searchMoreWithIdResponse>
      </soapenv:Body>
    </soapenv:Envelope>

请注意响应文档中的platformCore:recordList XML 标签为空。

我注意到一个不变的模式 - 在空页面之前没有完整的页面。例如。我们设置页面大小 = 10 并收到以下记录数作为响应:

page 1496 - 10
page 1497 - 5
page 1498 - 0
page 1499 - 0
page 1500 - 0
page 1501 - 10

我发现只有在官方文档中提到减小页面大小(在上面提供的同一个 PDF 文档中):

在执行搜索时请考虑以下可能的问题 返回大型数据集的 Web 服务或 SuiteScript。

如果最初符合搜索条件的记录已更新且不再符合条件,则搜索将跳过该记录。在这个 情况下,最初包含在搜索中的一些记录 结果可能不返回,返回的总数 记录可能小于原始结果总数。

如果创建了符合搜索条件的新记录,它们也会被返回。返回的记录总数可能更高 你翻页后的结果比原来的总数多了 结果,可能会返回重复的结果。

结果可能丢失。例如,如果第一个结果页面中的记录已更新并且不再符合条件,则另一个 记录现在适合第一页。但是,因为较早的页面是 在浏览搜索结果的后续页面时跳过,这 记录不返回。

在 Web 服务中,您翻阅搜索结果后返回的记录数可能大于或小于 最初符合搜索条件的记录。

结果集的第二页和后续页面可能包含的记录少于指定的页面大小。

但不确定是否与我们的案例有关。


所以问题:这是正常情况吗?它不需要一些额外的处理或重试吗?

【问题讨论】:

【参考方案1】:

这是可能发生的事情。请查看at this discussion 了解更多信息。

你引用的关键段落in the documentation是:

如果最初符合搜索条件的记录被更新并且不再符合条件,则搜索会跳过它。在这种情况下,可能不会返回原本包含在搜索结果中的某些记录,并且返回的记录总数可能会小于原来的结果总数。

这是页面中的实际记录可能与您期望的不同的主要情况。例如,假设您运行搜索以过滤lastModified。如果搜索需要一个小时才能完全运行,则在您循环浏览搜索结果期间可能会修改某些记录,导致在您到达那些记录将包含在其中的页面时它们从搜索结果中删除搜索结果。

【讨论】:

以上是关于NetSuite SuiteTalk API 中 searchMoreWithId 操作的结果为空页的主要内容,如果未能解决你的问题,请参考以下文章

Netsuite Web服务邮递员收藏在哪里?

使用php soapclient工具包显示访问netsuite wsdl无法加载wsdl

Netsuite - REST API - 使用基于令牌的身份验证 (TBA) 进行查询 - (在 Python 中)

通过 API Netsuite 检索自定义表单

Netsuite - REST API - 如何使用基于令牌的身份验证 (TBA) 创建新条目记录 - (在 Python 中)

Netsuite API - PHP将自定义字段附加到新客户