我正在研究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获得签名匹配。
答案 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}}