Руководства по POST запросам
POST
Теперь, когда мы увидели, как сделать GET запрос, давайте посмотрим, как сделать POST запрос. Это полезно, когда вам нужно отправить данные на сервер, например, при отправке формы или загрузке файла.
Чтобы сделать POST запрос, нам нужно изменить несколько вещей по сравнению с GET запросом:
- Мы установим метод в POST.
- Нам нужно предоставить тело запроса.
- Нам нужно указать тип данных в нашем теле, добавив заголовок
hyper::header::CONTENT_TYPE.
Для тела у нас есть несколько вариантов. Мы можем использовать простую строку, строку JSON или сырые байты. Давайте рассмотрим все три:
extern crate http_body_util; extern crate hyper; extern crate hyper_util; extern crate tokio; use http_body_util::Full; use hyper::body::Bytes; use hyper::Request; use hyper_util::rt::TokioIo; use tokio::net::TcpStream; async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?; let host = url.host().expect("uri has no host"); let port = url.port_u16().unwrap_or(80); let addr = format!("{}:{}", host, port); let stream = TcpStream::connect(addr).await?; let io = TokioIo::new(stream); let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?; tokio::task::spawn(async move { if let Err(err) = conn.await { println!("Connection failed: {:?}", err); } }); // Authority нашего URL будет именем хоста удаленного httpbin let authority = url.authority().unwrap().clone(); // Для простого текста let req_body = Full::<Bytes>::from("Some plain text as a body."); let req = Request::builder() .method(hyper::Method::POST) .header(hyper::header::HOST, authority.as_str()) .header(hyper::header::CONTENT_TYPE, "text/plain") .body(req_body)?; // Для JSON данных let json_data = r#"{"key": "value"}"#; let req_body = Full::<Bytes>::from(json_data); let req = Request::builder() .method(hyper::Method::POST) .header(hyper::header::HOST, authority.as_str()) .header(hyper::header::CONTENT_TYPE, "application/json") .body(req_body)?; // Для бинарных данных let binary_data = vec![0u8; 128]; // Пример бинарных данных let req_body = Full::<Bytes>::from(binary_data); let req = Request::builder() .method(hyper::Method::POST) .header(hyper::header::HOST, authority.as_str()) .header(hyper::header::CONTENT_TYPE, "application/octet-stream") .body(req_body)?; let res = sender.send_request(req).await?; println!("Response status: {}", res.status()); Ok(()) } fn main() {}