A common need when working with APIs is setting a base URL so you don’t repeat the full domain in every request. You can do this by customizing the client with HttpClient.mapRequest and HttpClientRequest.prependUrl.
import { FetchHttpClient, HttpClient, HttpClientRequest,} from "effect/unstable/http";import { Effect } from "effect";
function fetchFromApi() { return Effect.gen(function* () { // Create a client with a base URL baked in const client = (yield* HttpClient.HttpClient).pipe( HttpClient.mapRequest( HttpClientRequest.prependUrl("https://dummyjson.com"), ), );
// Now all requests are relative to the base URL const usersResponse = yield* client.get("/users/1"); const user = yield* usersResponse.json;
const productsResponse = yield* client.get("/products/1"); const product = yield* productsResponse.json;
return { user, product }; }).pipe(Effect.provide(FetchHttpClient.layer));}
// Test itEffect.runPromise(fetchFromApi()).then(({ user, product }) => { console.log("User:", user.firstName, user.lastName); console.log("Product:", product.title, `- $${product.price}`);});Output:
User: Emily JohnsonProduct: Essence Mascara Lash Princess - $9.99In the example above, we create a client with a base URL baked in using mapRequest and prependUrl. Every request made through this client only needs a relative path. "/users/1" becomes "https://dummyjson.com/users/1" automatically.