【问题标题】:How to escape single-quotes in Query Filter如何在查询过滤器中转义单引号
【发布时间】:2014-03-05 00:04:55
【问题描述】:

使用 QBO V3 API,我尝试查询名称中带有撇号的客户,但我不知道如何正确引用名称。

我使用过 API Explorer,当我输入这样的查询时:

select * from customer where displayname like '%O\'Halloran'

然后 API Explorer 工作并说 request-uri 真的是:

https://qb.sbfinance.intuit.com/v3/company/1002341430/query?query=select * from customer where displayname like '%25O%5C'Halloran'

请注意我的查询中的几件事:

  1. 我必须在值周围使用单引号
  2. 我必须自己转义单引号。

但是请注意,API Explorer 会返回给我的 URI:它保留单引号包装字符串,但不会转义值内的单引号。

如果我转身使用 API Explorer 正在使用的 exact 请求 URI - 它不起作用。我得到一个查询过滤器异常。很明显,API Explorer 向我展示的并不是真正的查询。

由于这些都没有被记录下来,我只能尝试对咒语进行逆向工程,但我无法确定它。我查看了 PHP SDK,但它也没有在那里解决,他们假设调用者(像我们一样)会知道自己该怎么做。

【问题讨论】:

    标签: intuit-partner-platform


    【解决方案1】:

    您需要使用\ 对其进行转义,然后还要对您发送的实际 URL 请求进行 URL 编码。

    您访问的实际 URL(对于 LIKE '%Keith O'Malley%' 的客户查询应该类似于:

    https://quickbooks.api.intuit.com/v3/company/730176505/query?query=SELECT+%2A+FROM+Customer+WHERE+FullyQualifiedName+LIKE+%27%25Keith+O%5C%27Mally%25%27+ 
    

    完整的 HTTP 请求如下所示:

    GET https://quickbooks.api.intuit.com/v3/company/730176505/query?query=SELECT+%2A+FROM+Customer+WHERE+FullyQualifiedName+LIKE+%27%25Keith+O%5C%27Mally%25%27+ HTTP/1.1
    Content-Type: text/plain
    Authorization: OAuth realm="", oauth_signature_method="HMAC-SHA1", oauth_signature="C9mzgdURjATMEymtAySNe%2BYBW7Q%3D",  oauth_nonce="3XDdP", oauth_timestamp="1394038522", oauth_token="lvprdgeo8rx8r1Ul10Bf474KjHEjcLFSVYttLJjcR2pFtIiD", oauth_consumer_key="qyprdlGJ4gWv4sMW0syilH2o4KirQe", oauth_version="1.0"
    

    如果您不致力于使用无法正确转义的 Intuit DevKit,可以使用开源 QuickBooks PHP DevKit 来正确处理这些事情:

    这是您正在寻找的具体示例:

    还有一堆其他的工作示例:

    【讨论】:

    【解决方案2】:

    请在单引号中使用转义字符 (\)(我认为您已经在 PHP 代码中这样做了)。 PHP 中应该有一些库(或函数)会执行此 url 编码。

    您也可以参考此标准 URL 编码指南。 http://www.w3schools.com/tags/ref_urlencode.asp

    Devkit 处理大部分这些编码。 https://developer.intuit.com/docs/0025_quickbooksapi/0055_devkits

    谢谢

    【讨论】:

      【解决方案3】:

      如果您使用 PHP 或 Ruby API 来创建调用,那么您应该在创建的字符串中同时转义 \ 字符和 ' 字符

      例如使用 Quickbooks Ruby API

      find_by("CompanyName", "Bill\\\'s Windsurf Shop") 
      

      生成正确的查询以搜索 Bill's Windsurg Shop

      【讨论】:

        【解决方案4】:

        我成功地将单引号字符替换为 URL 编码:%27

        如:query=SELECT%20Id%2CDisplayName%2CSyncToken%20FROM%20Customer%20WHERE%20Id%3E%270%27%20MAXRESULTS%201000

        仅供参考,我也注意到 API 控制台和 API Explorer 是宽容的(几乎是一个错误!)并且将接受比实际调用“更广泛的语法多样性”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多