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.ArrayListcan’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)