使用Hyper传递GET请求的数据

时间:2016-01-13 01:46:40

标签: rust hyper

我正在研究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

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

2 个答案:

答案 0 :(得分:3)

正如@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) // ...

答案 1 :(得分:0)

想出来。在GET请求中,您必须将正文附加到请求,它将自动填入数据包。以下是使其正常运行的代码。

{{1}}