1

我正在为 Rust 开发 Twitter API,并且在将参数传递给我的 GET 请求时遇到了问题。我用于请求的代码如下所示。data_body类似于“screen_name=a_user”,授权标头是 Twitter 所需的 OAuth 授权(这不是问题,因为它正在处理我的所有其他请求)。

let mut res = client.get("http://httpbin.org/get")
    .body(&data_body[..])
    .header(Authorization(authorization_header))
    .header(ContentType::form_url_encoded())
    .send().unwrap();

我开始将它发送到 httpbin.org,这样我就可以看到原始请求。我得到的结果如下所示。

{
  "args": {}, 
  "headers": {
    "Authorization": "OAuth oauth_consumer_key=\"\", oauth_nonce=\"RH9vZYMCbAtfQAuVh44fhlyGQfQqBCPq\", oauth_signature=\"dTbOyaURct0auVlC%2B8Y7vDFpus0%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1452648640\", oauth_token=\"\", oauth_version=\"1.0\"", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org"
  }, 
  "origin": "0.0.0.0", 
  "url": "http://httpbin.org/get"
}

Twitter api 文档给出的 curl 请求在下面有一个 GET 请求的数据部分(我已经用空字符串替换了我的键)。我可以确认这适用于 GET。

curl --get 'https://api.twitter.com/1.1/users/show.json' --data 'screen_name=twitterdev' --header 'Authorization: OAuth oauth_consumer_key="", oauth_nonce="6a37886cb38b2f5e12dee8fd47aa097c", oauth_signature="zhXDA5JbKRmw2xbJcEqK9sxuu5E%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1452647580", oauth_token="", oauth_version="1.0"' --verbose

ContentType从 Hyper API 中尝试了一堆不同的 s,但无法填充 HTTP 请求的 args 部分。我认为这就是问题所在,但我对 HTTP 没有太多经验,所以我很可能是错的。最终,请求返回一个 403(未经授权),这是由缺少的参数触发的。我知道我的 OAuth 标头正在正确生成,因为它正在处理所有 POST 请求,并且当我从 curl 命令复制随机数和时间戳时,我从 Twitter API 获得签名匹配。

4

2 回答 2

2

正如@hamersaw 所说,“GET 参数”是查询字符串中 URL 的一部分。如果您需要以编程方式设置参数(如果它们并不总是相同),该Url::set_query_from_pairs方法可以为您处理转义/编码:

use hyper::Url;
let mut url = Url::parse("https://api.twitter.com/1.1/users/show.json").unwrap();
url.set_query_from_pairs([
    ("screen_name", "twitterdev"),
].iter().cloned());
let res = client.get(url) // ...
于 2016-02-26T20:13:37.917 回答
0

弄清楚了。结果在 GET 请求中,您必须将正文附加到请求中,它将自动填写在数据包中。下面是让它工作的代码。

let mut res = client.get("http://httpbin.org/get?screen_name=twitter")
    .header(Authorization(authorization_header))
    .send().unwrap();
于 2016-01-13T04:23:18.803 回答