App Router (Server)
Next.jsServer Component with caching. Always use absolute URLs on server.
// app/users/page.jsx
async function UsersPage() {
const res = await fetch(
"https://ready-api.vercel.app/api/users",
{
next: { revalidate: 60 },
headers: { Authorization: "Bearer YOUR_API_KEY" }
}
);
const { data } = await res.json();
return (
<ul>
{data.map(user => (
<li key={user.id}>
{user.name} - {user.email}
</li>
))}
</ul>
);
}Client Component
Next.jsClient-side data fetching with hooks.
"use client";
import { useState, useEffect } from "react";
function UsersPage() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch("https://ready-api.vercel.app/api/users", {
headers: { Authorization: "Bearer YOUR_API_KEY" }
})
.then(res => res.json())
.then(data => {
setUsers(data.data);
setLoading(false);
});
}, []);
if (loading) return <div>Loading...</div>;
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}Node.js (fetch)
JavaScriptNative fetch in Node.js 18+.
import fetch from "node-fetch";
async function getUsers() {
const res = await fetch(
"https://ready-api.vercel.app/api/users?page=1&limit=10",
{
headers: {
Authorization: "Bearer YOUR_API_KEY"
}
}
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data } = await res.json();
console.log(data);
}requests
PythonSynchronous HTTP client.
import requests
url = "https://ready-api.vercel.app/api/users"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {"page": 1, "limit": 10}
res = requests.get(url, headers=headers, params=params)
data = res.json()
for user in data["data"]:
print(user["name"], "-", user["email"])net/http
GoStandard library HTTP client.
package main
import (
"io"
"fmt"
"net/http"
)
func main() {
url := "https://ready-api.vercel.app/api/users?page=1&limit=10"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
client := &http.Client{}
res, _ := client.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}reqwest
RustAsync HTTP client with tokio.
use reqwest;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::new();
let res = client
.get("https://ready-api.vercel.app/api/users?page=1&limit=10")
.header("Authorization", "Bearer YOUR_API_KEY")
.send()
.await?;
let data: serde_json::Value = res.json().await?;
println!("{:#?}", data);
Ok(())
}cURL
PHPUsing cURL extension.
<?php
$url = "https://ready-api.vercel.app/api/users?page=1&limit=10";
$headers = [
"Authorization: Bearer YOUR_API_KEY"
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
?>net/http
RubyStandard library HTTP.
require "net/http"
require "json"
url = URI("https://ready-api.vercel.app/api/users?page=1&limit=10")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = url.scheme == "https"
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer YOUR_API_KEY"
response = http.request(request)
data = JSON.parse(response.body)
puts data["data"]http package
FlutterCross-platform mobile HTTP.
import 'package:http/http.dart' as http;
import 'dart:convert';
Future<List<dynamic>> fetchUsers() async {
final response = await http.get(
Uri.parse('https://ready-api.vercel.app/api/users?page=1&limit=10'),
headers: {'Authorization': 'Bearer YOUR_API_KEY'},
);
if (response.statusCode == 200) {
return json.decode(response.body)['data'];
} else {
throw Exception('Failed to load users');
}
}URLSession
SwiftNative iOS HTTP client.
import Foundation
let url = URL(string: "https://ready-api.vercel.app/api/users?page=1&limit=10")!
var request = URLRequest(url: url)
request.setValue("Bearer YOUR_API_KEY", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, _, error in
guard let data = data else { return }
let json = try? JSONSerialization.jsonObject(with: data)
print(json ?? "No data")
}
task.resume()OkHttp
KotlinAndroid HTTP client.
import okhttp3.OkHttpClient
import okhttp3.Request
val client = OkHttpClient()
val request = Request.Builder()
.url("https://ready-api.vercel.app/api/users?page=1&limit=10")
.addHeader("Authorization", "Bearer YOUR_API_KEY")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
println(response.body?.string())
}
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
})Terminal
cURLWorks everywhere — terminal, CI, scripts.
# List users with pagination
curl -X GET "https://ready-api.vercel.app/api/users?page=1&limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"