Crate reqwest_cross

source ·
Expand description

§reqwest-cross

The reqwest-cross crate (inspired by ehttp) provides a wrapper around reqwest for ease of use in applications that target BOTH native and wasm and do not want to block in the calling task/thread, for example in a UI task/thread or game loop. This is achieved by using callbacks. NOTE: At least 1 feature flag for native MUST be set to choose which runtime to use. Currently only Tokio is supported but if you want to use another runtime please open an issue on github and we’d be happy to add it. To communicate between the callback and the caller you can use various approaches such as:

  • channels (used in examples)
  • Arc<Mutex<_>>
  • promises and so on.

§Examples

For examples of how to use this crate see fetch

§Feature Flags

Exactly 1 of the “native-*” flags MUST be enabled to select which runtime to use for native. If one of the other options needs to be used instead of tokio then defaults must be disabled. For example: reqwest-cross = { version = "*", default-features = false, features = ["native-async-std"] } (The feature in this example does not exist at this time, only used for demonstration purposes).

  • native-tokio: Sets tokio as the runtime to use for native. (Default)

§Tradeoffs

Exposing underlying framework that actually sends the requests: The currently selected approach of exposing and using reqwest::RequestBuilder is much more flexible than the fully isolated approach used by ehttp and is generally desirable as it allows for reuse of the same reqwest::Client as recommended by reqwest.However, since reqwest::Client is asynchronous it requires an available runtime. For wasm the spawning of the futures is handled by wasm-bindgen-futures but for local which runtime is specified using feature flags. If the one you want is not listed please create an issue and I’ll attempt to add it.

§How to run tokio on “secondary” thread

If you want to use the main thread for your UI and need to run tokio on a “secondary” thread I found this example helpful. I found it in this discussion, which had other suggested examples as well.

Structs§

  • An asynchronous Client to make Requests with.

Functions§

  • Performs a HTTP requests and calls the given callback when done. NB: Needs to use a callback to prevent blocking on the thread that initiates the fetch. Note: Instead of calling get like in the example you can use post, put, etc. (See reqwest::Client). Also see the examples folder for more complete examples.