web-sys: using fetch - The `wasm-bindgen` Guide

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# The `fetch` API

View full source code or view the compiled example online

This example uses the `fetch` API to make an HTTP request to the GitHub API and then parses the resulting JSON.

## `Cargo.toml`

The `Cargo.toml` enables a number of features related to the `fetch` API and types used: `Headers`, `Request`, etc.

    [package]
    authors = ["The wasm-bindgen Developers"]
    edition = "2021"
    name = "fetch"
    publish = false
    version = "0.0.0"

    [lib]
    crate-type = ["cdylib"]

    [dependencies]
    js-sys = { path = "../../crates/js-sys" }
    wasm-bindgen = { path = "../../" }
    wasm-bindgen-futures = { path = "../../crates/futures" }

    [dependencies.web-sys]
    features = ['Headers', 'Request', 'RequestInit', 'RequestMode', 'Response', 'Window']
    path = "../../crates/web-sys"

    [lints]
    workspace = true

## `src/lib.rs`

    #![allow(unused)]
    fn main() {
    use wasm_bindgen::prelude::*;
    use wasm_bindgen_futures::JsFuture;
    use web_sys::{Request, RequestInit, RequestMode, Response};

    #[wasm_bindgen]
    pub async fn run(repo: String) -> Result<JsValue, JsValue> {
        let opts = RequestInit::new();
        opts.set_method("GET");
        opts.set_mode(RequestMode::Cors);

        let url = format!("https://api.github.com/repos/{repo}/branches/master");

        let request = Request::new_with_str_and_init(&url, &opts)?;

        request
            .headers()
            .set("Accept", "application/vnd.github.v3+json")?;

        let window = web_sys::window().unwrap();
        let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?;

        // `resp_value` is a `Response` object.
        assert!(resp_value.is_instance_of::<Response>());
        let resp: Response = resp_value.dyn_into().unwrap();

        // Convert this other `Promise` into a rust `Future`.
        let json = JsFuture::from(resp.json()?).await?;

        // Send the JSON response back to JS.
        Ok(json)
    }
    }