Intuit IPP Rest API查询字符串转义

Intuit IPP Rest API查询字符串转义,api,rest,intuit-partner-platform,intuit,Api,Rest,Intuit Partner Platform,Intuit,那么对于 比如说,如果我想查询一个名为ABC的客户,我可以使用如下http get请求 https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'ABC' select Id from Customer where FullyQualifiedName='A&B' https://qb.sbfinance.in

那么对于

比如说,如果我想查询一个名为ABC的客户,我可以使用如下http get请求

https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'ABC'
select Id from Customer where FullyQualifiedName='A&B'
https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'A%26B'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-03-20T06:24:12.408-07:00">
  <Fault type="ValidationFault">
    <Error code="4000">
      <Message>Error parsing query</Message>
      <Detail>QueryParserError: Invalid content. Lexical error at line 1, column 44.  Encountered: &lt;EOF&gt; after : &quot;\'A&quot;</Detail>
    </Error>
  </Fault>
</IntuitResponse>
&3D是对“=”的url转义,这样做没有任何问题

现在,如果客户的名字是A&B,我尝试使用如下查询字符串

https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'ABC'
select Id from Customer where FullyQualifiedName='A&B'
https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'A%26B'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-03-20T06:24:12.408-07:00">
  <Fault type="ValidationFault">
    <Error code="4000">
      <Message>Error parsing query</Message>
      <Detail>QueryParserError: Invalid content. Lexical error at line 1, column 44.  Encountered: &lt;EOF&gt; after : &quot;\'A&quot;</Detail>
    </Error>
  </Fault>
</IntuitResponse>
在url编码之后,看起来是这样的

https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'ABC'
select Id from Customer where FullyQualifiedName='A&B'
https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'A%26B'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-03-20T06:24:12.408-07:00">
  <Fault type="ValidationFault">
    <Error code="4000">
      <Message>Error parsing query</Message>
      <Detail>QueryParserError: Invalid content. Lexical error at line 1, column 44.  Encountered: &lt;EOF&gt; after : &quot;\'A&quot;</Detail>
    </Error>
  </Fault>
</IntuitResponse>
它将失败

有什么想法吗

更新

以上URL是我从IPP的API资源管理器复制的

这是我正在使用的代码

返回的xml数据如下所示

https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'ABC'
select Id from Customer where FullyQualifiedName='A&B'
https://qb.sbfinance.intuit.com/v3/company/198445012/query?query=select Id from Customer where FullyQualifiedName%3D'A%26B'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-03-20T06:24:12.408-07:00">
  <Fault type="ValidationFault">
    <Error code="4000">
      <Message>Error parsing query</Message>
      <Detail>QueryParserError: Invalid content. Lexical error at line 1, column 44.  Encountered: &lt;EOF&gt; after : &quot;\'A&quot;</Detail>
    </Error>
  </Fault>
</IntuitResponse>
这将把url编码为

https://qb.sbfinance.intuit.com/v3/company/1122502005/query?query=select%20*%20from%20Customer%20where%20DisplayName='A&B'
好的,终于找到了问题:

真正的问题是Uri(url)不会在'A&B'中转义,因为它不知道它是url还是数据的一部分,所以我更改了下面的一行

conReq = conReq.ForUrl(string.Format(@"https://qb.sbfinance.intuit.com/v3/company/{0}/query?query={1}", Settings.Default.QuickBooksOnlineRealmId, @"select * from Customer where DisplayName='A&B'"));
作为


首先使用Uri.EscapeDataString转义数据查询字符串

请看这里的一个例子来逃避特殊字符-

using Intuit.Ipp.Core;
using Intuit.Ipp.Data;
using Intuit.Ipp.LinqExtender;
using Intuit.Ipp.QueryFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


static class SampleCalls
{
public static Customer QueryCustomerByDisplayName(ServiceContext context, string     displayName)     {
displayName = displayName.Replace("'", "\\'"); //Escape special characters
QueryService<Customer> customerQueryService = new QueryService<Customer>(context);
return customerQueryService.Where(m => m.DisplayName == displayName).FirstOrDefault();
}
}
使用Intuit.Ipp.Core;
使用Intuit.Ipp.Data;
使用Intuit.Ipp.LinqExtender;
使用Intuit.Ipp.QueryFilter;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
静态类抽样调用
{
公共静态客户查询CustomerByDisplayName(ServiceContext上下文,字符串displayName){
displayName=displayName.Replace(“'”,“\\'”);//转义特殊字符
QueryService customerQueryService=新的QueryService(上下文);
返回customerQueryService.Where(m=>m.DisplayName==DisplayName).FirstOrDefault();
}
}

如果创建名为“a&B”的客户,则V3服务将返回该客户对象,如下所示-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-03-20T01:54:46.834-07:00">
    <Customer domain="QBO" sparse="false">
        <Id>10</Id>
        <SyncToken>0</SyncToken>
        <MetaData>
            <CreateTime>2014-03-20T01:54:46-07:00</CreateTime>
            <LastUpdatedTime>2014-03-20T01:54:47-07:00</LastUpdatedTime>
        </MetaData>
        <FullyQualifiedName>A&amp;B</FullyQualifiedName>
        <DisplayName>A&amp;B</DisplayName>
        <PrintOnCheckName>A&amp;B</PrintOnCheckName>
        <Active>true</Active>
        <Taxable>true</Taxable>
        <Job>false</Job>
        <BillWithParent>false</BillWithParent>
        <Balance>100.00</Balance>
        <BalanceWithJobs>100.00</BalanceWithJobs>
        <PreferredDeliveryMethod>Email</PreferredDeliveryMethod>
    </Customer>
</IntuitResponse>
但是它需要像下面那样进行url编码

SELECT+*+FROM+Customer+WHERE+DisplayName+%3D+%27A%26B%27
实现这一点的Java代码-

Customer customer = GenerateQuery.createQueryEntity(Customer.class);
String query = select($(customer)).where($(customer.getDisplayName()).eq("A&B")).generate();
// Query output - SELECT * FROM Customer WHERE DisplayName = 'A&B'
String encodedUrl = URLEncoder.encode(query, "UTF-8");
它工作得很好。(Devkit可以很好地处理所有这些问题)

希望这能回答你的问题


谢谢

我用我的实际代码更新了这个问题,我认为已定义的代码可以处理url编码。从返回的消息来看,似乎是问题的原因,但仍然不知道如何修复itI,我不确定它在dev-defined中是如何工作的(很可能,您需要显式地对其进行编码)。在value子句中,您已经传递了-%3D'A%26B'。您可以看到单引号没有编码。请注意这一点,就像我在使用java尝试此查询时所做的那样。您可以使用IPP的.net库进行此调用。Devkit下载链接-谢谢