Logging Responses

Avatar of Hemanta SundarayHemanta Sundaray

HttpClient.tap() runs a side effect after a successful response is received. This is the response-side counterpart to tapRequest.

http.ts
import {
FetchHttpClient,
HttpClient,
HttpClientRequest,
} from "effect/unstable/http";
import { Effect } from "effect";
function fetchUserWithResponseLogging(userId: number) {
return Effect.gen(function* () {
const client = (yield* HttpClient.HttpClient).pipe(
HttpClient.tap((response) =>
Effect.sync(() => {
console.log(`[Response] Status: ${response.status}`);
console.log(`[Response] Headers:`, response.headers);
}),
),
);
const request = HttpClientRequest.get(
`https://dummyjson.com/users/${userId}`,
);
const response = yield* client.execute(request);
const user = yield* response.json;
return user;
}).pipe(Effect.provide(FetchHttpClient.layer));
}
// Test it
Effect.runPromise(fetchUserWithResponseLogging(1)).then((user) => {
console.log("User:", user.firstName, user.lastName);
});

Output:

Terminal
[Response] Status: 200
[Response] Headers: {
'access-control-allow-origin': '*',
'cf-cache-status': 'DYNAMIC',
'cf-ray': '9d0617b0acc6d43a-SIN',
connection: 'keep-alive',
'content-encoding': 'br',
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 19 Feb 2026 13:25:51 GMT',
etag: 'W/"58f-CoL/KoXlW3x1PtqQr3wqPsXj6DE"',
nel: '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}',
'report-to': '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=2mQIukE1lkEHVqD0dmK%2F4UFc%2B%2FaDuB%2FAkxldT47AFxVSW4kn57D%2BxUr9%2FCi6ZGCIbRvtIfafgQfMZfi3wBrZklxBNYX0R39HUBw4FZsyLaYJQJ8DyJXDt%2FI%3D"}]}',
server: 'cloudflare',
'strict-transport-security': 'max-age=15552000; includeSubDomains',
'transfer-encoding': 'chunked',
vary: 'Accept-Encoding',
'x-content-type-options': 'nosniff',
'x-dns-prefetch-control': 'off',
'x-download-options': 'noopen',
'x-frame-options': 'SAMEORIGIN',
'x-ratelimit-limit': '100',
'x-ratelimit-remaining': '73',
'x-ratelimit-reset': '1771507553',
'x-xss-protection': '1; mode=block'
}
User: Emily Johnson

tap receives the HttpClientResponse object. Like tapRequest, it’s a side effect. The response flows through unchanged.

Sign in to save progress

Stay in the loop

Get notified when new chapters are added and when this course is complete.