Rust에서 HTTP 요청을하려면 어떻게해야합니까?
Rust에서 HTTP 요청을하려면 어떻게해야합니까? 핵심 라이브러리에서 아무것도 찾을 수없는 것 같습니다.
출력을 구문 분석 할 필요가 없습니다. 요청을하고 HTTP 응답 코드를 확인하기 만하면됩니다.
누군가가 내 URL에 쿼리 매개 변수를 URL 인코딩하는 방법을 보여줄 수 있다면 보너스를드립니다!
업데이트 :이 답변은 상당히 오래된 역사에 관한 것입니다. 현재 모범 사례는 대신 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의 마스터 브랜치를 추적합니다. 현재로서는 방금 출시 된 Rust 0.8에서 작동하지만 조만간 주요 변경 사항이있을 것입니다. 실제로 Rust 0.8에서 작동하는 rust-http 버전은 없습니다. 릴리스 직전에 프라이버시 규칙에서 해결할 수없는 주요 변경 사항이 있었기 때문에 rust-http가 추가로 의존하는 무언가에 접근 할 수 없게되었습니다. 이 문제는 수정되었지만 rust-http는 Rust 0.8과 호환되지 않습니다.
쿼리 문자열 인코딩 문제에 관해서는 현재 extra::url::Query
(typedef for ~[(~str, ~str)]
) 로 수행해야합니다 . 변환을위한 적절한 기능 :
extra::url::query_from_str
(죄송합니다. 지금은 비공개이므로 사용할 수 없습니다. PR은 곧 공개 될 예정입니다. 그동안이 링크는 실제로 작동하지 않아야하며 https://github.com/ 때문에 사용할 수 있습니다. mozilla / rust / issues / 7476. )
Rust에서 HTTP를 수행하는 가장 쉬운 방법은 reqwest 입니다. Hyper 를 사용하기 쉽게 만드는 래퍼 입니다.
Hyper 는 Rust를위한 인기있는 HTTP 라이브러리이며 Tokio 의 이벤트 루프를 사용하여 non-blocking 요청을 만들고 futures-rs 를 선물 / 약속에 사용합니다. 하이퍼 예는 다음과 같습니다 크게 영감 기반 의 문서의 예 .
// Rust 1.36, Hyper 0.12.35, tokio-core 0.1.17, futures 0.1.29
extern crate futures;
extern crate hyper;
extern crate tokio_core;
use futures::{Future};
use hyper::{Client, Uri};
use tokio_core::reactor::Core;
fn main() {
// Core is the Tokio event loop used for making a non-blocking request
let mut core = Core::new().unwrap();
let client = Client::new();
let url : Uri = "http://httpbin.org/response-headers?foo=bar".parse().unwrap();
assert_eq!(url.query(), Some("foo=bar"));
let request_result = core.run(client
.get(url)
.map(|res| {
println!("Response: {}", res.status());
})
.map_err(|err| {
println!("Error: {}", err);
})
);
}
에서 Cargo.toml
:
[dependencies]
hyper = "0.12.35"
tokio-core = "0.1.17"
futures = "0.1.29"
후손을 위해 원래 답변을 아래에 남겨 두었지만 Rust 1.19에 대한 업데이트는 위를 참조하십시오 (이 글을 쓰는 현재 최신 안정 버전).
나는 당신이 찾고있는 것이 표준 라이브러리 에 있다고 믿는다 . 이제 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의 단위 테스트에 몇 가지 예가 있습니다.
컬 바인딩 사용. 이것을 당신의 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());
}
Isaac의 답변에 대해 자세히 설명하기 위해 reqwest 라이브러리를 사용하여 쿼리 매개 변수로 POST 요청을 만드는 예가 있습니다.
Cargo.toml
[package]
name = "play_async"
version = "0.1.0"
edition = "2018"
[dependencies]
reqwest = "0.9.14"
tokio = "0.1.18"
futures = "0.1.21"
암호
use futures::{Future, Stream};
use reqwest::r#async::{Client, Decoder};
use std::mem;
fn post_greeting() -> impl Future<Item=(), Error=()> {
Client::new()
.get("https://webhook.site/1dff66fd-07ff-4cb5-9a77-681efe863747")
.header("Accepts", "application/json")
.query(&[
("hello", "1"),
("world", "ABCD"),
])
.send()
.and_then(|mut res| {
println!("{}", res.status());
let body = mem::replace(res.body_mut(), Decoder::empty());
body.concat2()
})
.map_err(|err| println!("request error: {}", err))
.map(|body| {
let v = body.to_vec();
let s = String::from_utf8_lossy(&v);
println!("response: {} ", s);
})
}
fn main() {
let f = post_greeting();
tokio::run(f);
}
https://webhook.site로 이동 하여 웹훅 링크를 만들고 코드를 변경합니다. 서버에서 수신 된 요청을 실시간으로 볼 수 있습니다.
주로 Bastian Gruber의 예를 기반으로 함 https://github.com/gruberb/futures_playground
참조 URL : https://stackoverflow.com/questions/14154753/how-do-i-make-an-http-request-from-rust
'IT이야기' 카테고리의 다른 글
Os.Rename에서 강제 덮어 쓰기 (0) | 2021.04.30 |
---|---|
set_time_limit ()와 ini_set ( 'max_execution_time',…)의 차이점 (0) | 2021.04.30 |
[Microsoft] [ODBC 드라이버 관리자] 데이터 원본 이름이없고 기본 드라이버가 지정되지 않았습니다. (0) | 2021.04.29 |
Visual Studio가 빌드 중에 계속 중단되었을때 (0) | 2021.04.29 |
Windows 8.1에서 빌드되지 않는 노드 패키지-Microsoft.Cpp.Default.props 누락 (0) | 2021.04.29 |