Rust から HTTP リクエストを作成するにはどうすればよいですか? コア ライブラリに何も見つからないようです。
出力を解析する必要はありません。リクエストを作成して HTTP 応答コードを確認するだけです。
誰かが URL のクエリ パラメータを URL エンコードする方法を教えてくれればボーナス マーク!
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-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 の単体テストにいくつかの例があります。
私は、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)]
) で行う必要があります。変換に適した関数:
extra::url::query_from_str
(申し訳ありませんが、これは非公開であるため、現在これを使用することはできません。公開するためのPRです。それまでの間、このリンクは実際には機能しないはずです.https://github.com/のためにのみ利用可能です. mozilla/rust/issues/7476 .)
カール バインディングの使用。これをあなたに貼り付けます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());
}