Http 如何从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()

我正在编写一个函数,向网站发出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() -> 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的请求。