【问题标题】:Bill Filtering only returns default 10 sorted records without doing any filtering from QBO账单过滤仅返回默认的 10 条排序记录,而不从 QBO 进行任何过滤
【发布时间】:2013-03-18 05:13:15
【问题描述】:

请找到以下用于过滤账单的代码,即使我通过了resultperpage>10,它也只返回10条排序记录。

public IEnumerable<Intuit.Ipp.Data.Qbo.Bill> FilterBills(DataServices dataServices, int startPage, int resultsPerPage, DateTime After, DateTime Before)
    {
Intuit.Ipp.Security.OAuthRequestValidator oAuthRequestValidator = ((Intuit.Ipp.Security.OAuthRequestValidator)dataServices.ServiceContext.RequestValidator);

            OAuthConsumerContext consumerContext = new OAuthConsumerContext
            {
                ConsumerKey = oAuthRequestValidator.ConsumerKey,
                SignatureMethod = SignatureMethod.HmacSha1,
                ConsumerSecret = oAuthRequestValidator.ConsumerSecret
            };

            OAuthSession oSession = new OAuthSession(consumerContext, "https://oauth.intuit.com/oauth/v1/get_request_token",
                        "https://workplace.intuit.com/Connect/Begin",
                        "https://oauth.intuit.com/oauth/v1/get_access_token");

            oSession.AccessToken = new TokenBase
            {
                Token = oAuthRequestValidator.AccessToken,
                ConsumerKey = oAuthRequestValidator.ConsumerKey,
                TokenSecret = oAuthRequestValidator.AccessTokenSecret
            };

            var body = "PageNum={0}&ResultsPerPage={1}&Filter=LastUpdatedTime :AFTER: {2} :AND: LastUpdatedTime :BEFORE: {3} & Sort=LastUpdatedTime HighToLow";
            body = String.Format(body, startPage, resultsPerPage, After.ToString("yyyy-mm-ddTHH:MM:ssz"), Before.ToString("yyyy-mm-ddTHH:MM:ssz"));

            IConsumerRequest conReq = oSession.Request();
            conReq = conReq.Post().WithRawContentType("application/x-www-form-urlencoded").WithRawContent(System.Text.Encoding.ASCII.GetBytes(body)); ;
            conReq = conReq.ForUrl(dataServices.ServiceContext.BaseUrl + "bills/v2/" + dataServices.ServiceContext.RealmId);
            conReq = conReq.SignWithToken();

            Intuit.Ipp.Data.Qbo.SearchResults searchResults = (Intuit.Ipp.Data.Qbo.SearchResults)dataServices.ServiceContext.Serializer.Deserialize<Intuit.Ipp.Data.Qbo.SearchResults>(conReq.ReadBody());
            IEnumerable<Intuit.Ipp.Data.Qbo.Bill> SearchResult = ((Intuit.Ipp.Data.Qbo.Bills)(searchResults.CdmCollections)).Bill;
            return SearchResult;
 }

发送请求后,我将响应作为 10 个排序的账单记录而没有收到任何错误。我使用的是IPPDotNetDevKit 2.1.12.0 版本。

请查看此过滤问题。

【问题讨论】:

  • 请提供过滤解决方案。上面的代码对我不起作用。
  • peter,感谢您的回复,我可以通过 OAuth 进行身份验证。我已经发布了关于支持的详细信息。请检查。我正在开发 saas 应用程序,但这不是实时的。正因为如此,我会收到那个错误吗?

标签: c#-4.0 intuit-partner-platform quickbooks-online intuit


【解决方案1】:

在上面的示例中,OAuth 参数在请求正文中传递并覆盖您的请求正文,因此默认为 PageNum=1&ResultsPerPage=20。此外,日期格式不正确。这是一个可以工作的代码示例。

public IEnumerable<Intuit.Ipp.Data.Qbo.Bill> FilterBills(DataServices dataServices, int startPage, int resultsPerPage, DateTime After, DateTime Before)
{
    StringBuilder requestXML = new StringBuilder();
    StringBuilder responseXML = new StringBuilder();

    var requestBody =
        "PageNum={0}&ResultsPerPage={1}&Filter=LastUpdatedTime :AFTER: {2} :AND: LastUpdatedTime :BEFORE: {3}&Sort=LastUpdatedTime HighToLow";
    requestBody = String.Format(requestBody, startPage, resultsPerPage, After.ToString("yyyy-MM-ddThh:mm:sszzz"),
                            Before.ToString("yyyy-MM-ddThh:mm:sszzz"));

    HttpWebRequest httpWebRequest =
        WebRequest.Create(dataServices.ServiceContext.BaseUrl + "bills/v2/" +
                            dataServices.ServiceContext.RealmId) as HttpWebRequest;
    httpWebRequest.Method = "POST";
    httpWebRequest.ContentType = "application/x-www-form-urlencoded";
    httpWebRequest.Headers.Add("Authorization", GetDevDefinedOAuthHeader(httpWebRequest, requestBody));
    requestXML.Append(requestBody);
    UTF8Encoding encoding = new UTF8Encoding();
    byte[] content = encoding.GetBytes(requestXML.ToString());
    using (var stream = httpWebRequest.GetRequestStream())
    {
        stream.Write(content, 0, content.Length);
    }
    HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
    using (Stream data = httpWebResponse.GetResponseStream())
    {
        Intuit.Ipp.Data.Qbo.SearchResults searchResults =
            (Intuit.Ipp.Data.Qbo.SearchResults)
            dataServices.ServiceContext.Serializer.Deserialize<Intuit.Ipp.Data.Qbo.SearchResults>(
                new StreamReader(data).ReadToEnd());
        return ((Intuit.Ipp.Data.Qbo.Bills) searchResults.CdmCollections).Bill.ToList();
    }
}


private string GetDevDefinedOAuthHeader(HttpWebRequest webRequest, string requestBody)
{

    OAuthConsumerContext consumerContext = new OAuthConsumerContext
    {
        ConsumerKey = consumerKey,
        ConsumerSecret = consumerSecret,
        SignatureMethod = SignatureMethod.HmacSha1,
        UseHeaderForOAuthParameters = true

    };

    consumerContext.UseHeaderForOAuthParameters = true;

    OAuthSession oSession = new OAuthSession(consumerContext, "https://www.example.com",
                            "https://www.example.com",
                            "https://www.example.com");


    oSession.AccessToken = new TokenBase
    {
        Token = accessToken,
        ConsumerKey = consumerKey,
        TokenSecret = accessTokenSecret
    };

    IConsumerRequest consumerRequest = oSession.Request();
    consumerRequest = ConsumerRequestExtensions.ForMethod(consumerRequest, webRequest.Method);
    consumerRequest = ConsumerRequestExtensions.ForUri(consumerRequest, webRequest.RequestUri);
    if (webRequest.Headers.Count > 0)
    {
        ConsumerRequestExtensions.AlterContext(consumerRequest, context => context.Headers = webRequest.Headers);
        if (webRequest.Headers[HttpRequestHeader.ContentType] == "application/x-www-form-urlencoded")
        {
            Dictionary<string, string> formParameters = new Dictionary<string, string>();
            foreach (string formParameter in requestBody.Split('&'))
            {
                formParameters.Add(formParameter.Split('=')[0], formParameter.Split('=')[1]);
            }
            consumerRequest = consumerRequest.WithFormParameters(formParameters);
        }
    }

    consumerRequest = consumerRequest.SignWithToken();
    return consumerRequest.Context.GenerateOAuthParametersForHeader();
}

【讨论】:

  • Peter 对于这段代码我得到“远程服务器返回错误:(401)未经授权。”错误。
  • 您的 OAuth 令牌无效。你能用 API Explorer 测试它们吗? apiexplorer.developer.intuit.com
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2019-09-04
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2012-04-29
  • 1970-01-01
相关资源
最近更新 更多