Simple HTTP fetch request

This is good example. The updated version of it is:

pub fn main() !void {
    var gpa: std.heap.DebugAllocator(.{}) = .init;
    const allocator = gpa.allocator();
    defer _ = gpa.deinit();

    var threaded: std.Io.Threaded = .init_single_threaded;
    const io: std.Io = threaded.io();

    var client: std.http.Client = .{ .allocator = allocator, .io = io };
    defer client.deinit();

    const endpoint = try std.Uri.parse("https://api.quotable.kurokeita.dev/api/quotes/random");
    var request = try client.request(.GET, endpoint, .{});
    defer request.deinit();

    try request.sendBodiless();
    var response = try request.receiveHead(&.{});

    var transfer_buffer: [64]u8 = undefined;
    var decompress: std.http.Decompress = undefined;
    var decompress_buffer: [std.compress.flate.max_window_len]u8 = undefined;
    const response_reader = response.readerDecompressing(&transfer_buffer, &decompress, &decompress_buffer);

    var json_reader: std.json.Reader = .init(gpa.allocator(), response_reader);
    defer json_reader.deinit();

    const QuoteResponse = struct {
        quote: struct {
            author: struct {
                bio: []u8,
                description: []u8,
                id: []u8,
                link: []u8,
                name: []u8,
                slug: []u8,
            },
            content: []u8,
            id: []u8,
            tags: []struct {
                id: []u8,
                name: []u8,
            },
        },
    };

    const parsed: std.json.Parsed(QuoteResponse) = try std.json.parseFromTokenSource(QuoteResponse, allocator, &json_reader, .{
        .allocate = .alloc_always,
        .parse_numbers = true,
        .ignore_unknown_fields = true,
    });
    defer parsed.deinit();

    if (response.head.status.class() != .success) {
        @panic("Handle errors");
    }

    const quote = parsed.value.quote;

    var stdout_buffer: [128]u8 = undefined;
    var stdout = std.fs.File.stdout().writer(&stdout_buffer);
    try stdout.interface.print("\"{s}\"\n\n- {s}", .{ quote.content, quote.author.name });
    try stdout.interface.flush();
}

const std = @import("std");


  • Looks like std.ArrayList can’t be used in the client object

  • Not sure if there’s a less verbose way to do:

    const response_reader = response.readerDecompressing(&transfer_buffer, &decompress, &decompress_buffer);
    

    as there are limited examples (one of which is this)

1 Like