88

Rust から HTTP リクエストを作成するにはどうすればよいですか? コア ライブラリに何も見つからないようです。

出力を解析する必要はありません。リクエストを作成して HTTP 応答コードを確認するだけです。

誰かが URL のクエリ パラメータを URL エンコードする方法を教えてくれればボーナス マーク!

4

8 に答える 8

92

Rust で HTTP リクエストを作成する最も簡単な方法は、reqwestクレートを使用することです。

use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    let resp = reqwest::blocking::get("https://httpbin.org/ip")?.text()?;
    println!("{:#?}", resp);
    Ok(())
}

Cargo.toml

[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }

非同期

Reqwest は、Tokioを使用した非同期HTTP リクエストの作成もサポートしています。

use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let resp = reqwest::get("https://httpbin.org/ip")
        .await?
        .text()
        .await?;
    println!("{:#?}", resp);
    Ok(())
}

Cargo.toml

[dependencies]
reqwest = "0.11"
tokio = { version = "1", features = ["full"] }

ハイパー

Reqwest は、 Rust で人気のある HTTP ライブラリであるHyperの使いやすいラッパーです。接続の管理をさらに制御する必要がある場合は、直接使用できます。Hyperベースの例を以下に示します。これは主にドキュメントの例に触発されたものです。

use hyper::{body::HttpBody as _, Client, Uri};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let client = Client::new();

    let res = client
        .get(Uri::from_static("http://httpbin.org/ip"))
        .await?;

    println!("status: {}", res.status());

    let buf = hyper::body::to_bytes(res).await?;

    println!("body: {:?}", buf);
}

Cargo.toml

[dependencies]
hyper = { version = "0.14", features = ["full"] }
tokio = { version = "1", features = ["full"] }

元の回答 (Rust 0.6)

あなたが探しているものは標準ライブラリにあると思います。現在rust-httpであり、Chris Morganの答えは、当面の間、現在のRustの標準的な方法です。私はどこまであなたを連れて行くことができるかわかりません (そして、私があなたを間違った方向に連れて行かないことを願っています!), しかし、あなたは次のようなものが欲しいでしょう:

// Rust 0.6 -- old code
extern mod std;

use std::net_ip;
use std::uv;

fn main() {
    let iotask = uv::global_loop::get();
    let result = net_ip::get_addr("www.duckduckgo.com", &iotask);

    io::println(fmt!("%?", result));
}

エンコーディングに関しては、src/libstd/net_url.rs の単体テストにいくつかの例があります。

于 2013-01-07T02:30:01.750 に答える
31

更新: この回答は、かなり古い歴史に言及しています。現在のベスト プラクティスについては、代わりにIsaac Aggrey の回答を参照してください。


私は、Rust の事実上のHTTP ライブラリとなったrust-httpに取り組んできました(Servo はそれを使用しています)。それは完全にはほど遠いものであり、現在のところ文書化も不十分です。リクエストを作成し、ステータス コードで何かを実行する例を次に示します。

extern mod http;
use http::client::RequestWriter;
use http::method::Get;
use http::status;
use std::os;

fn main() {
    let request = RequestWriter::new(Get, FromStr::from_str(os::args()[1]).unwrap());
    let response = match request.read_response() {
        Ok(response) => response,
        Err(_request) => unreachable!(), // Uncaught condition will have failed first
    };
    if response.status == status::Ok {
        println!("Oh goodie, I got me a 200 OK response!");
    } else {
        println!("That URL ain't returning 200 OK, it returned {} instead", response.status);
    }
}

URL を唯一のコマンドライン引数としてこのコードを実行すると、ステータス コードがチェックされます。(HTTP のみ。HTTPS はありません。)

src/examples/client/client.rsもう少し多くのことを行う例については、と比較してください。

rust-http は、rust の master ブランチを追跡しています。現時点では、リリースされたばかりの Rust 0.8 で動作しますが、すぐに重大な変更が行われる可能性があります。 実際、Rust 0.8 で動作するrust-http のバージョンはありません — リリース直前にプライバシー規則で回避できない重大な変更があり、rust-http が依存するものを extra::url にアクセスできないままにしました。これはその後修正されましたが、rust-http は Rust 0.8 と互換性がありません。


クエリ文字列のエンコードの問題については、現時点ではextra::url::Query(a typedef for ~[(~str, ~str)]) で行う必要があります。変換に適した関数:

于 2013-09-27T14:01:02.620 に答える
22

カール バインディングの使用。これをあなたに貼り付けますCargo.toml

[dependencies.curl]
git = "https://github.com/carllerche/curl-rust"

...そしてこれはsrc/main.rs

extern crate curl;

use curl::http;

fn main(){
  let resp = http::handle()
    .post("http://localhost:3000/login", "username=dude&password=sikrit")
    .exec().unwrap();

  println!("code={}; headers={}; body={}",
    resp.get_code(), resp.get_headers(), resp.get_body());    

}
于 2014-10-06T09:06:51.297 に答える