Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/http-rs/surf
Fast and friendly HTTP client framework for async Rust
https://github.com/http-rs/surf
Last synced: 28 days ago
JSON representation
Fast and friendly HTTP client framework for async Rust
- Host: GitHub
- URL: https://github.com/http-rs/surf
- Owner: http-rs
- License: apache-2.0
- Created: 2019-07-07T09:48:40.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-09-11T14:52:24.000Z (about 1 year ago)
- Last Synced: 2024-04-14T07:49:20.171Z (7 months ago)
- Language: Rust
- Homepage: https://docs.rs/surf
- Size: 365 KB
- Stars: 1,446
- Watchers: 17
- Forks: 119
- Open Issues: 98
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE-APACHE
- Code of conduct: .github/CODE_OF_CONDUCT.md
Awesome Lists containing this project
- awesome-http - Surf - rs/surf) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/http-rs/surf) (Programming Languages / Rust)
README
Surf
Surf the web
### Surf the web - HTTP client framework
Surf is a Rust HTTP client built for ease-of-use and multi-HTTP-backend flexibility.
Whether it's a quick script, or a cross-platform SDK, Surf will make it work.- Extensible through a powerful middleware system
- Multiple HTTP back-ends that can be chosen
- Reuses connections through a configurable `Client` interface
- Fully streaming requests and responses
- TLS enabled by default (native tls or rustls)
- Built on async-std (with optional tokio support)## Examples
```rust
let mut res = surf::get("https://httpbin.org/get").await?;
dbg!(res.body_string().await?);
```It's also possible to skip the intermediate `Response`, and access the response type directly.
```rust
dbg!(surf::get("https://httpbin.org/get").recv_string().await?);
```Both sending and receiving JSON is real easy too.
```rust
#[derive(Deserialize, Serialize)]
struct Ip {
ip: String
}let uri = "https://httpbin.org/post";
let data = &Ip { ip: "129.0.0.1".into() };
let res = surf::post(uri).body_json(data)?.await?;
assert_eq!(res.status(), 200);let uri = "https://api.ipify.org?format=json";
let Ip { ip } = surf::get(uri).recv_json().await?;
assert!(ip.len() > 10);
```And even creating streaming proxies is no trouble at all.
```rust
let req = surf::get("https://img.fyi/q6YvNqP").await?;
let body = surf::http::Body::from_reader(req, None);
let res = surf::post("https://box.rs/upload").body(body).await?;
```Setting configuration on a client is also straightforward.
```rust
use std::convert::TryInto;
use std::time::Duration;
use surf::{Client, Config};
use surf::Url;let client: Client = Config::new()
.set_base_url(Url::parse("http://example.org")?)
.set_timeout(Some(Duration::from_secs(5)))
.try_into()?;let mut res = client.get("/").await?;
println!("{}", res.body_string().await?);
```## Features
The following features are available. The default features are
`curl-client`, `middleware-logger`, and `encoding`
- __`curl-client` (default):__ use `curl` (through `isahc`) as the HTTP backend.
- __`h1-client`:__ use `async-h1` as the HTTP backend with native TLS for HTTPS.
- __`h1-client-rustls`:__ use `async-h1` as the HTTP backend with `rustls` for HTTPS.
- __`hyper-client`:__ use `hyper` (hyper.rs) as the HTTP backend.
- __`wasm-client`:__ use `window.fetch` as the HTTP backend.
- __`middleware-logger` (default):__ enables logging requests and responses using a middleware.
- __`encoding` (default):__ enables support for body encodings other than utf-8.## Installation
Install OpenSSL -
- Ubuntu - ``` sudo apt install libssl-dev ```
- Fedora - ``` sudo dnf install openssl-devel ```Make sure your rust is up to date using:
``` rustup update ```With [cargo add](https://github.com/killercup/cargo-edit#Installation) installed :
```sh
$ cargo add surf
```## Safety
This crate makes use of a single instance of `unsafe` in order to make the WASM
backend work despite the `Send` bounds. This is safe because WASM targets
currently have no access to threads. Once they do we'll be able to drop this
implementation, and use a parked thread instead and move to full multi-threading
in the process too.## Contributing
Want to join us? Check out our ["Contributing" guide][contributing] and take a
look at some of these issues:- [Issues labeled "good first issue"][good-first-issue]
- [Issues labeled "help wanted"][help-wanted]## See Also
- [http-rs/http-client](https://github.com/http-rs/http-client)
- [http-rs/http-service](https://github.com/http-rs/http-service)
- [http-rs/tide](https://github.com/http-rs/tide)## Thanks
Special thanks to [prasannavl](https://github.com/prasannavl) for donating the
crate name, and [sagebind](https://github.com/sagebind) for creating an easy to
use `async` curl client that saved us countless hours.## License
[MIT](./LICENSE-MIT) OR [Apache-2.0](./LICENSE-APACHE)
[1]: https://img.shields.io/crates/v/surf.svg?style=flat-square
[2]: https://crates.io/crates/surf
[3]: https://img.shields.io/travis/http-rs/surf/main.svg?style=flat-square
[4]: https://travis-ci.org/http-rs/surf
[5]: https://img.shields.io/crates/d/surf.svg?style=flat-square
[6]: https://crates.io/crates/surf
[7]: https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square
[8]: https://docs.rs/surf
[releases]: https://github.com/http-rs/surf/releases
[contributing]: https://github.com/http-rs/surf/blob/main/.github/CONTRIBUTING.md
[good-first-issue]: https://github.com/http-rs/surf/labels/good%20first%20issue
[help-wanted]: https://github.com/http-rs/surf/labels/help%20wanted