使用Twitter开发者API在VB.Net中的HttpWebRequest上执行400错误请求

使用Twitter开发者API在VB.Net中的HttpWebRequest上执行400错误请求,vb.net,twitter,oauth,httpwebrequest,Vb.net,Twitter,Oauth,Httpwebrequest,我刚开始使用Twitter开发API,但遇到了一些问题 在不详细介绍我的代码的情况下,我知道问题出在HttpWebRequest中: ... 'create WebRequest Dim request As WebRequest = HttpWebRequest.Create(urlFinal) request.PreAuthenticate = True request.Method = URL_METHOD request.Headers.add("authorization

我刚开始使用Twitter开发API,但遇到了一些问题

在不详细介绍我的代码的情况下,我知道问题出在HttpWebRequest中:


...

'create WebRequest
Dim request As WebRequest = HttpWebRequest.Create(urlFinal)
request.PreAuthenticate = True
request.Method = URL_METHOD
request.Headers.add("authorization", authString)
request.ContentType = "application/json"

'execute it and open reader
Dim response As WebResponse = request.GetResponse()
Dim reader As StreamReader = New StreamReader(response.GetResponseStream())

'parse WebResponse into String to use it...
Dim rawresp As String
rawresp = reader.ReadToEnd()

...

URL_方法是“GET”,我将在下面解释我的authString。URL是可变的,但可能类似于

每当执行此操作时,我都会收到一个“400-Bad Request”错误

Dim response As WebResponse = request.GetResponse()
我对它做了一些研究,发现它要么是URL的问题,要么是身份验证的问题

URL很好,我可以在调试模式下通过断点很容易地检查它。在浏览器中打开URL时,我收到错误:

{"errors":[{"code":215,"message":"Bad Authentication data."}]}
所以它必须是身份验证

下面是我的authString的外观:

Dim authString As String = "OAuth"
authString += " oauth_consumer_key=""" & OAUTH_KEY & """"
authString += ", oauth_nonce=""" & OAUTH_NONCE & """"
authString += ", oauth_signature=""" & OAUTH_SIGN & """"
authString += ", oauth_signature_method=""" & OAUTH_SIGN_METHOD & """"
authString += ", oauth_timestamp=""" & OAUTH_TIMESTAMP & """"
authString += ", oauth_token=""" & OAUTH_TOKEN & """"
authString += ", oauth_version=""" & OAUTH_VERSION & """"
我在运行时也检查了这一点,得到了以下结果:

OAuth oauth_consumer_key="xxx", oauth_nonce="xxx", oauth_signature="xxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1571760986", oauth_token="xxx", oauth_version="1.0"
OAUTH_令牌(访问令牌)和OAUTH_密钥(API密钥)来自这里:

OAUTH_NONCE(NONCE)和OAUTH_TIMESTAMP(TIMESTAMP)的计算如下:

OAUTH_NONCE = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
OAUTH_TIMESTAMP = Convert.ToInt64((DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString()
Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}"
Dim baseString = String.Format(baseFormat, OAUTH_KEY, OAUTH_NONCE, OAUTH_SIGN_METHOD, OAUTH_TIMESTAMP, OAUTH_TOKEN, OAUTH_VERSION, Uri.EscapeDataString(URL_METHOD))
baseString = String.Concat(URL_METHOD & "&", Uri.EscapeDataString(URL_BASE), "&", Uri.EscapeDataString(baseString))

Dim compositeKey = String.Concat(Uri.EscapeDataString(OAUTH_KEY_SECRET), "&", Uri.EscapeDataString(OAUTH_TOKEN_SECRET))
Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
    OAUTH_SIGN = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
End Using
OAUTH_签名(签名)如下:

OAUTH_NONCE = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
OAUTH_TIMESTAMP = Convert.ToInt64((DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString()
Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}"
Dim baseString = String.Format(baseFormat, OAUTH_KEY, OAUTH_NONCE, OAUTH_SIGN_METHOD, OAUTH_TIMESTAMP, OAUTH_TOKEN, OAUTH_VERSION, Uri.EscapeDataString(URL_METHOD))
baseString = String.Concat(URL_METHOD & "&", Uri.EscapeDataString(URL_BASE), "&", Uri.EscapeDataString(baseString))

Dim compositeKey = String.Concat(Uri.EscapeDataString(OAUTH_KEY_SECRET), "&", Uri.EscapeDataString(OAUTH_TOKEN_SECRET))
Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
    OAUTH_SIGN = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
End Using
签名方法和OAuth版本是硬编码的(见上文,您可能需要向右滚动)

谁能给我解释一下错误在哪里吗

我很欣赏每一个答案,并渴望尝试它的一切,我只是没有任何其他想法了

事先非常感谢


Ben

帮助诊断的一种方法是检查通过邮递员发送的邮件头。帮助诊断的一种方法是检查通过邮递员发送的邮件头