bevy_http_client 0.11.0

A simple HTTP client for Bevy
Documentation
use bevy::{prelude::*, time::common_conditions::on_timer};

use bevy_http_client::prelude::*;

fn main() {
    App::new()
        .add_plugins((MinimalPlugins, HttpClientPlugin))
        .add_systems(Startup, init_request)
        .add_systems(
            Update,
            send_request.run_if(on_timer(std::time::Duration::from_secs(1))),
        )
        .run();
}

#[derive(Component)]
struct IpRequestMarker;

fn init_request(mut commands: Commands) {
    let entity = commands.spawn(IpRequestMarker).id();
    let request = HttpClient::new_with_entity(entity).get("https://api.ipify.org");
    commands
        .entity(entity)
        .insert(request)
        .observe(handle_response)
        .observe(handle_error);
}

fn send_request(
    clients: Query<&HttpClient, With<IpRequestMarker>>,
    mut ev_request: MessageWriter<HttpRequest>,
) {
    let requests: Vec<HttpRequest> = clients
        .iter()
        .filter_map(|c| match c.clone().try_build() {
            Ok(request) => Some(request),
            Err(e) => {
                eprintln!("Failed to build request: {}", e);
                None
            }
        })
        .collect();

    ev_request.write_batch(requests);
}

fn handle_response(response: On<HttpObserved<HttpResponse>>) {
    println!("response: {:?}", response.event().inner().text());
}

fn handle_error(error: On<HttpObserved<HttpResponseError>>) {
    println!("Error retrieving IP: {}", error.event().inner().err);
}