Http 如何从get响应中获取cookie?
我正在编写一个函数,向网站发出GET请求并返回响应cookie:Http 如何从get响应中获取cookie?,http,cookies,rust,hyper,Http,Cookies,Rust,Hyper,我正在编写一个函数,向网站发出GET请求并返回响应cookie: extern crate futures; extern crate hyper; extern crate tokio_core; use tokio_core::reactor::Core; use hyper::Client; use std::error::Error; use hyper::header::Cookie; use futures::future::Future; fn get_new_cookie()
extern crate futures;
extern crate hyper;
extern crate tokio_core;
use tokio_core::reactor::Core;
use hyper::Client;
use std::error::Error;
use hyper::header::Cookie;
use futures::future::Future;
fn get_new_cookie() -> Result<String, Box<Error>> {
println!("Getting cookie...");
let core = Core::new()?;
let client = Client::new(&core.handle());
println!("Created client");
let uri = "http://www.cnn.com".parse().expect("Cannot parse url");
println!("Parsed url");
let response = client.get(uri).wait().expect("Cannot get url.");
println!("Got response");
let cookie = response
.headers()
.get::<Cookie>()
.expect("Cannot get cookie");
println!("Cookie: {}", cookie);
Ok(cookie)
}
fn main() {
println!("{:?}", get_new_cookie());
}
在那之后什么也没发生
我做错了什么?我如何改变它使其工作?请参阅:
注意:此方法不适用于调用事件循环或类似方法
I/O情况,因为它将阻止事件循环
进度(这会阻塞线程)。只应调用此方法
当保证与此相关的阻塞工作
未来将由另一个线程完成
Future::wait
已成为分支
我建议设计完整的应用程序来处理异步概念(即,get\u new\u cookie
应该采用句柄
并返回未来
,而不是分配自己的事件循环)
您可以使用以下方式运行请求:
let response = core.run(client.get(uri)).expect("Cannot get url.");
见:
注意:此方法不适用于调用事件循环或类似方法
I/O情况,因为它将阻止事件循环
进度(这会阻塞线程)。只应调用此方法
当保证与此相关的阻塞工作
未来将由另一个线程完成
Future::wait
已成为分支
我建议设计完整的应用程序来处理异步概念(即,get\u new\u cookie
应该采用句柄
并返回未来
,而不是分配自己的事件循环)
您可以使用以下方式运行请求:
let response = core.run(client.get(uri)).expect("Cannot get url.");
因为,通过调用wait
,您将使线程处于休眠状态,直到将来完成。但是,该线程需要运行事件循环,因此您刚刚造成了死锁。使用更正确
例如,“Cookie”头用于向服务器发送Cookie。用于向客户端发送cookie。它还返回所有cookie的向量:
fn get_new_cookie() -> Result<String, Box<Error>> {
println!("Getting cookie...");
let mut core = Core::new()?;
let client = Client::new(&core.handle());
println!("Created client");
let uri = "http://www.cnn.com".parse().expect("Cannot parse url");
println!("Parsed url");
let response = core.run(client.get(uri)).expect("Cannot get url.");
println!("Got response");
let cookie = response
.headers()
.get::<SetCookie>()
.expect("Cannot get cookie");
println!("Cookie: {:?}", cookie);
Ok(cookie.join(","))
}
fn获取新的cookie()->结果{
println!(“得到饼干…”);
让mut core=core::new()?;
让client=client::new(&core.handle());
println!(“创建的客户”);
让uri=”http://www.cnn.com.parse().expect(“无法解析url”);
println!(“解析url”);
让response=core.run(client.get(uri)).expect(“无法获取url”);
println!(“得到响应”);
让cookie=响应
.headers()
.get::()
.expect(“无法获取cookie”);
println!(“Cookie:{:?}”,Cookie);
Ok(cookie.join(“,”))
}
但是,如果您只需要一个同步API,请改用。它构建在Hyper:
extern crate reqwest;
use std::error::Error;
use reqwest::header::SetCookie;
fn get_new_cookie() -> Result<String, Box<Error>> {
let response = reqwest::get("http://www.cnn.com")?;
let cookies = match response.headers().get::<SetCookie>() {
Some(cookies) => cookies.join(","),
None => String::new(),
};
Ok(cookies)
}
fn main() {
println!("{:?}", get_new_cookie());
}
外部板条箱要求;
使用std::error::error;
使用reqwest::header::SetCookie;
fn获取新的cookie()->结果{
让response=reqwest::get(“http://www.cnn.com")?;
让cookies=匹配响应.headers().get::(){
Some(cookies)=>cookies.join(“,”),
None=>String::new(),
};
Ok(饼干)
}
fn main(){
println!(“{:?}”,获取新的cookie());
}
因为,通过调用等待
,您将使线程处于休眠状态,直到将来完成。但是,该线程需要运行事件循环,因此您刚刚造成了死锁。使用更正确
例如,“Cookie”头用于向服务器发送Cookie。用于向客户端发送cookie。它还返回所有cookie的向量:
fn get_new_cookie() -> Result<String, Box<Error>> {
println!("Getting cookie...");
let mut core = Core::new()?;
let client = Client::new(&core.handle());
println!("Created client");
let uri = "http://www.cnn.com".parse().expect("Cannot parse url");
println!("Parsed url");
let response = core.run(client.get(uri)).expect("Cannot get url.");
println!("Got response");
let cookie = response
.headers()
.get::<SetCookie>()
.expect("Cannot get cookie");
println!("Cookie: {:?}", cookie);
Ok(cookie.join(","))
}
fn获取新的cookie()->结果{
println!(“得到饼干…”);
让mut core=core::new()?;
让client=client::new(&core.handle());
println!(“创建的客户”);
让uri=”http://www.cnn.com.parse().expect(“无法解析url”);
println!(“解析url”);
让response=core.run(client.get(uri)).expect(“无法获取url”);
println!(“得到响应”);
让cookie=响应
.headers()
.get::()
.expect(“无法获取cookie”);
println!(“Cookie:{:?}”,Cookie);
Ok(cookie.join(“,”))
}
但是,如果您只需要一个同步API,请改用。它构建在Hyper:
extern crate reqwest;
use std::error::Error;
use reqwest::header::SetCookie;
fn get_new_cookie() -> Result<String, Box<Error>> {
let response = reqwest::get("http://www.cnn.com")?;
let cookies = match response.headers().get::<SetCookie>() {
Some(cookies) => cookies.join(","),
None => String::new(),
};
Ok(cookies)
}
fn main() {
println!("{:?}", get_new_cookie());
}
外部板条箱要求;
使用std::error::error;
使用reqwest::header::SetCookie;
fn获取新的cookie()->结果{
让response=reqwest::get(“http://www.cnn.com")?;
让cookies=匹配响应.headers().get::(){
Some(cookies)=>cookies.join(“,”),
None=>String::new(),
};
Ok(饼干)
}
fn main(){
println!(“{:?}”,获取新的cookie());
}
这与Cookie有什么关系?问题出现在let response
行,该行与Cookie完全无关。服务器返回的Cookie位于Set Cookie
头中;Cookie
头用于向服务器发送Cookie的请求。这与Cookie有何关系?问题出现在let response
行,该行与Cookie完全无关。服务器返回的Cookie位于Set Cookie
头中;Cookie
头用于向服务器发送Cookie的请求。