可以在限定次数内重试临时性的服务端失败。让所有尝试共用一个 std.http.Client, 可以利用其连接池复用符合条件的 keep-alive 连接;每次收到响应后调用 request.deinit(),使客户端能够释放或复用连接。只有当请求安全且服务允许时,才应该重试失败。
//! Retry transient HTTP failures while reusing one HTTP client.
const std = @import("std");
const http = std.http;
pub fn main(init: std.process.Init) !void {
const io = init.io;
const gpa = init.gpa;
const uri = try std.Uri.parse("https://httpbin.org/status/503");
var client: http.Client = .{ .allocator = gpa, .io = io };
defer client.deinit();
var attempt: u8 = 0;
while (attempt < 3) : (attempt += 1) {
var request = try client.request(.GET, uri, .{});
try request.sendBodiless();
var response_buffer: [1024]u8 = undefined;
const response = try request.receiveHead(&response_buffer);
const status_code = @intFromEnum(response.head.status);
std.debug.print("attempt {d}: HTTP {d}\n", .{ attempt + 1, status_code });
request.deinit();
if (status_code < 500) return;
}
std.debug.print("retry limit reached\n", .{});
}