QuickBooks Online Api 错误 "远程服务器返回一个错误。(400) Bad Request"

问题描述 投票:0回答:1

我正在使用QBO API,并且在我试图检索访问和刷新令牌的步骤中。当我发送请求时,当我试图获取响应时,我得到了一个错误,说明 "远程服务器返回一个错误。(400) Bad Request". 请看下面的代码。

我已经在我的头中尝试了一些变化,但不能让它工作。

有什么好办法吗?

代码(使用vb.net)。

Sub Step2_GetTokens()
    'Delcare variables. 
    Dim vHTTPREQUEST As HttpWebRequest
    Dim vHTTPRESPONSE As HttpWebResponse
    Dim vSTREAMOBJECT As Stream
    Dim vSTREAMREADER As StreamReader
    Dim vSTREAMDATA As String

    Dim vAUTHORIZATIONCODE As String
    Dim vREDIRECTURI As String
    Dim vCLIENTID As String
    Dim vCLIENTSECRET As String
    Dim vURI As String
    Dim vTOKEN As String

    'Set variables. 
    vAUTHORIZATIONCODE = "myauthorizationcodefrompreviousstep"
    vREDIRECTURI = "http://localhost:8000/myredirectpage.aspx"
    vCLIENTID = "myclientid"
    vCLIENTSECRET = "myclientsecret"

    'Set URI and Token. 
    vURI = String.Format("https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer?grant_type=authorization_code&code={0}&redirect_uri={1}", vAUTHORIZATIONCODE, vREDIRECTURI)
    vTOKEN = "Basic " + System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(vCLIENTID + ":" + vCLIENTSECRET))

    'Create and send Http request.
    vHTTPREQUEST = CType(WebRequest.Create(vURI), HttpWebRequest)
    vHTTPREQUEST.Method = "POST"
    vHTTPREQUEST.ContentLength = 0
    vHTTPREQUEST.Credentials = CredentialCache.DefaultCredentials
    vHTTPREQUEST.ContentType = "application/x-www-form-urlencoded"
    vHTTPREQUEST.Accept = "application/json"
    vHTTPREQUEST.Headers.Add("Authorization", vTOKEN)

    'Return Http response.   THE ERROR OCCURS AT NEXT LINE
    vHTTPRESPONSE = CType(vHTTPREQUEST.GetResponse(), HttpWebResponse)
    vSTREAMOBJECT = vHTTPRESPONSE.GetResponseStream()
    vSTREAMREADER = New StreamReader(vSTREAMOBJECT, Text.Encoding.UTF8)
    vSTREAMDATA = vSTREAMREADER.ReadToEnd()

    'Display results from respense.
    TextBox1.Text = vSTREAMDATA

    'All done. 
    vHTTPRESPONSE.Close()
    vSTREAMREADER.Close()
End Sub
asp.net vb.net asp.net-web-api quickbooks-online webapi
1个回答
0
投票

万岁!我从我的问题中得到了答案。我从Intuit开发人员的论坛上得到了我的问题的答案,但想在这里分享,以及如果其他人正在寻找。问题是我需要将URI中的参数放在HTTP请求体中,而不是URI本身。

更具体地说,我的原始代码片段的以下部分设置了URI的值被传递到请求中。如果你仔细看,它有参数 "grant_type"、"code "和 "redirect_uri"。这些需要从这里删除,并添加到HTTP POST请求的主体中。

vURI = String.Format("https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer?grant_type=authorization_code&code={0}&redirect_uri={1}", vAUTHORIZATIONCODE, vREDIRECTURI)

不知道为什么,也不知道他们为什么要这样设置,但事实就是这样......以后再研究吧。现在,这里是完整的修改后的代码,完美的工作。

在你到达那里之前,请注意一些其他的改动,这些改动并没有真正产生任何影响,但你应该知道。

  1. 我删除了 "vHTTPREQUEST.Credentials = CredentialCache.DefaultCredentials "这一行,因为正如@evry1falls所指出的那样,它是不必要的。

  2. 我移动了 "vHTTPREQUEST.ContentLength = 0 "这一行,并将其改为基于字节长度(见新添加的部分)。这符合开发者的建议,也可能比我原来的做法更好。

下面是我从Intuit开发人员那里得到的基于我的解决方案的示例代码。它是用 "c "写的,所以我把它转换成了 "vb"。

https:/github.comIntuitDeveloperOAuth2-Dotnet-WithoutSDKblob08d47724c5879d30da9cd8d6b365751514462953OAuth2_SampleApp_DotnetOAuth2Manager.aspx.cs#L423。

下面是新的代码(使用vb.net)

Sub step2_get_token()
    'Delcare variables. 
    Dim vHTTPREQUEST As HttpWebRequest
    Dim vHTTPRESPONSE As HttpWebResponse
    Dim vSTREAMOBJECT As Stream
    Dim vSTREAMREADER As StreamReader
    Dim vSTREAMDATA As String

    Dim vAUTHORIZATIONCODE As String
    Dim vREDIRECTURI As String
    Dim vCLIENTID As String
    Dim vCLIENTSECRET As String
    Dim vURI As String
    Dim vTOKEN As String

    'Set variables. 
    vAUTHORIZATIONCODE = "myauthorizationcodefrompreviousstep"
    vREDIRECTURI = "http://localhost:8000/myredirectpage.aspx"
    vCLIENTID = "myclientid"
    vCLIENTSECRET = "myclientsecret"

    'Set URI and Token. NOTE: I removed the parameters from the URI. 
    vURI = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
    vTOKEN = "Basic " + System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(vCLIENTID + ":" + vCLIENTSECRET))

    'Create a Http request with the appropriate headers. NOTE: I removed the credentials line and moved the content length line.
    vHTTPREQUEST = CType(WebRequest.Create(vURI), HttpWebRequest)
    vHTTPREQUEST.Method = "POST"
    vHTTPREQUEST.ContentType = "application/x-www-form-urlencoded"
    vHTTPREQUEST.Accept = "application/json"
    vHTTPREQUEST.Headers.Add("Authorization", vTOKEN)

    '*** HERE IS THE SECTION I ADDED ***
    'Build request body. Not sure how this is working, but it works. (You can use UTF8 or ASCII)
    Dim vHTTPREQUESTBODY As String = String.Format("grant_type=authorization_code&code={0}&redirect_uri={1}", vAUTHORIZATIONCODE, System.Uri.EscapeDataString(vREDIRECTURI))
    Dim vBYTEVERSIONOFBODY As Byte() = Encoding.ASCII.GetBytes(vHTTPREQUESTBODY)
    vHTTPREQUEST.ContentLength = vBYTEVERSIONOFBODY.Length
    Dim vDATASTREAM As Stream = vHTTPREQUEST.GetRequestStream()
    vDATASTREAM.Write(vBYTEVERSIONOFBODY, 0, vBYTEVERSIONOFBODY.Length)
    vDATASTREAM.Close()
    '*** END OF THE SECTION I ADDED ***

    'Send Http request and get a repsonse. The "GetResponse" method both sends a request to an Internet resource and returns a WebResponse instance.
    vHTTPRESPONSE = CType(vHTTPREQUEST.GetResponse(), HttpWebResponse)
    vSTREAMOBJECT = vHTTPRESPONSE.GetResponseStream()
    vSTREAMREADER = New StreamReader(vSTREAMOBJECT, Text.Encoding.UTF8)
    vSTREAMDATA = vSTREAMREADER.ReadToEnd()

    'Set output parameter.
    TextBox1.Text = vSTREAMDATA

    'All done. 
    vHTTPRESPONSE.Close()
    vSTREAMREADER.Close()
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.