2026-01-24 22:40:22 +00:00
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > Making HTTP Requests - Wren-CLI Manual</ title >
< link rel = "stylesheet" href = "../css/style.css" >
</ head >
< body >
< button class = "mobile-menu-toggle" > Menu</ button >
< div class = "container" >
< aside class = "sidebar" >
< div class = "sidebar-header" >
< h1 >< a href = "../index.html" > Wren-CLI</ a ></ h1 >
< div class = "version" > v0.4.0</ div >
</ div >
< nav class = "sidebar-nav" >
< div class = "section" >
< span class = "section-title" > Getting Started</ span >
< ul >
< li >< a href = "../getting-started/index.html" > Overview</ a ></ li >
< li >< a href = "../getting-started/installation.html" > Installation</ a ></ li >
< li >< a href = "../getting-started/first-script.html" > First Script</ a ></ li >
< li >< a href = "../getting-started/repl.html" > Using the REPL</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > Language</ span >
< ul >
< li >< a href = "../language/index.html" > Syntax Overview</ a ></ li >
< li >< a href = "../language/classes.html" > Classes</ a ></ li >
< li >< a href = "../language/methods.html" > Methods</ a ></ li >
< li >< a href = "../language/control-flow.html" > Control Flow</ a ></ li >
< li >< a href = "../language/fibers.html" > Fibers</ a ></ li >
< li >< a href = "../language/modules.html" > Modules</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > API Reference</ span >
< ul >
< li >< a href = "../api/index.html" > Overview</ a ></ li >
2026-01-25 03:58:39 +00:00
< li >< a href = "../api/string.html" > String</ a ></ li >
< li >< a href = "../api/number.html" > Num</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../api/argparse.html" > argparse</ a ></ li >
2026-01-24 22:40:22 +00:00
< li >< a href = "../api/base64.html" > base64</ a ></ li >
< li >< a href = "../api/crypto.html" > crypto</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../api/dataset.html" > dataset</ a ></ li >
2026-01-24 22:40:22 +00:00
< li >< a href = "../api/datetime.html" > datetime</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../api/dns.html" > dns</ a ></ li >
< li >< a href = "../api/env.html" > env</ a ></ li >
< li >< a href = "../api/fswatch.html" > fswatch</ a ></ li >
< li >< a href = "../api/html.html" > html</ a ></ li >
< li >< a href = "../api/http.html" > http</ a ></ li >
2026-01-24 22:40:22 +00:00
< li >< a href = "../api/io.html" > io</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../api/jinja.html" > jinja</ a ></ li >
< li >< a href = "../api/json.html" > json</ a ></ li >
< li >< a href = "../api/markdown.html" > markdown</ a ></ li >
2026-01-24 22:40:22 +00:00
< li >< a href = "../api/math.html" > math</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../api/net.html" > net</ a ></ li >
< li >< a href = "../api/os.html" > os</ a ></ li >
< li >< a href = "../api/pathlib.html" > pathlib</ a ></ li >
< li >< a href = "../api/regex.html" > regex</ a ></ li >
< li >< a href = "../api/scheduler.html" > scheduler</ a ></ li >
< li >< a href = "../api/signal.html" > signal</ a ></ li >
< li >< a href = "../api/sqlite.html" > sqlite</ a ></ li >
< li >< a href = "../api/subprocess.html" > subprocess</ a ></ li >
< li >< a href = "../api/sysinfo.html" > sysinfo</ a ></ li >
< li >< a href = "../api/tempfile.html" > tempfile</ a ></ li >
< li >< a href = "../api/timer.html" > timer</ a ></ li >
< li >< a href = "../api/tls.html" > tls</ a ></ li >
< li >< a href = "../api/udp.html" > udp</ a ></ li >
< li >< a href = "../api/uuid.html" > uuid</ a ></ li >
< li >< a href = "../api/wdantic.html" > wdantic</ a ></ li >
< li >< a href = "../api/web.html" > web</ a ></ li >
< li >< a href = "../api/websocket.html" > websocket</ a ></ li >
2026-01-24 22:40:22 +00:00
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > Tutorials</ span >
< ul >
< li >< a href = "../tutorials/index.html" > Tutorial List</ a ></ li >
< li >< a href = "../tutorials/http-client.html" > HTTP Client</ a ></ li >
< li >< a href = "../tutorials/websocket-chat.html" > WebSocket Chat</ a ></ li >
< li >< a href = "../tutorials/database-app.html" > Database App</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../tutorials/template-rendering.html" > Templates</ a ></ li >
2026-01-24 22:40:22 +00:00
< li >< a href = "../tutorials/cli-tool.html" > CLI Tool</ a ></ li >
2026-01-25 18:02:02 +00:00
< li >< a href = "../tutorials/web-server.html" > Web Server</ a ></ li >
2026-01-24 22:40:22 +00:00
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > How-To Guides</ span >
< ul >
< li >< a href = "index.html" > How-To List</ a ></ li >
< li >< a href = "http-requests.html" class = "active" > HTTP Requests</ a ></ li >
< li >< a href = "json-parsing.html" > JSON Parsing</ a ></ li >
< li >< a href = "regex-patterns.html" > Regex Patterns</ a ></ li >
< li >< a href = "file-operations.html" > File Operations</ a ></ li >
< li >< a href = "async-operations.html" > Async Operations</ a ></ li >
< li >< a href = "error-handling.html" > Error Handling</ a ></ li >
</ ul >
</ div >
2026-01-25 18:02:02 +00:00
< div class = "section" >
< span class = "section-title" > Contributing</ span >
< ul >
< li >< a href = "../contributing/index.html" > Overview</ a ></ li >
< li >< a href = "../contributing/module-overview.html" > Module Architecture</ a ></ li >
< li >< a href = "../contributing/pure-wren-module.html" > Pure-Wren Modules</ a ></ li >
< li >< a href = "../contributing/c-backed-module.html" > C-Backed Modules</ a ></ li >
< li >< a href = "../contributing/foreign-classes.html" > Foreign Classes</ a ></ li >
< li >< a href = "../contributing/async-patterns.html" > Async Patterns</ a ></ li >
< li >< a href = "../contributing/testing.html" > Writing Tests</ a ></ li >
< li >< a href = "../contributing/documentation.html" > Documentation</ a ></ li >
</ ul >
</ div >
2026-01-24 22:40:22 +00:00
</ nav >
</ aside >
< main class = "content" >
< nav class = "breadcrumb" >
< a href = "../index.html" > Home</ a >
< span class = "separator" > /</ span >
< a href = "index.html" > How-To Guides</ a >
< span class = "separator" > /</ span >
< span > HTTP Requests</ span >
</ nav >
< article >
< h1 > Making HTTP Requests</ h1 >
< h2 > Basic GET Request</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/data")
System.print(response.body)</ code ></ pre >
< h2 > GET Request with JSON Response</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://jsonplaceholder.typicode.com/posts/1")
var data = response.json
System.print("Title: %(data["title"])")</ code ></ pre >
< h2 > GET Request with Headers</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/data", {
"Accept": "application/json",
"User-Agent": "Wren-CLI/1.0"
})
System.print(response.body)</ code ></ pre >
< h2 > POST Request with JSON Body</ h2 >
< pre >< code > import "http" for Http
import "json" for Json
var data = {
"name": "John Doe",
"email": "john@example.com"
}
var response = Http.post(
"https://api.example.com/users",
Json.stringify(data),
{"Content-Type": "application/json"}
)
System.print("Status: %(response.statusCode)")
System.print("Created: %(response.json)")</ code ></ pre >
< h2 > PUT Request</ h2 >
< pre >< code > import "http" for Http
import "json" for Json
var data = {
"id": 1,
"name": "Jane Doe",
"email": "jane@example.com"
}
var response = Http.put(
"https://api.example.com/users/1",
Json.stringify(data),
{"Content-Type": "application/json"}
)
System.print("Updated: %(response.statusCode == 200)")</ code ></ pre >
< h2 > DELETE Request</ h2 >
< pre >< code > import "http" for Http
var response = Http.delete("https://api.example.com/users/1")
System.print("Deleted: %(response.statusCode == 204)")</ code ></ pre >
< h2 > PATCH Request</ h2 >
< pre >< code > import "http" for Http
import "json" for Json
var response = Http.patch(
"https://api.example.com/users/1",
Json.stringify({"email": "newemail@example.com"}),
{"Content-Type": "application/json"}
)
System.print("Patched: %(response.statusCode)")</ code ></ pre >
< h2 > Bearer Token Authentication</ h2 >
< pre >< code > import "http" for Http
var token = "your-api-token"
var response = Http.get("https://api.example.com/protected", {
"Authorization": "Bearer %(token)"
})
System.print(response.json)</ code ></ pre >
< h2 > Basic Authentication</ h2 >
< pre >< code > import "http" for Http
import "base64" for Base64
var username = "user"
var password = "pass"
var credentials = Base64.encode("%(username):%(password)")
var response = Http.get("https://api.example.com/protected", {
"Authorization": "Basic %(credentials)"
})
System.print(response.body)</ code ></ pre >
< h2 > API Key Authentication</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/data", {
"X-API-Key": "your-api-key"
})
System.print(response.body)</ code ></ pre >
< h2 > Check Response Status</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/data")
if (response.statusCode == 200) {
System.print("Success: %(response.json)")
} else if (response.statusCode == 404) {
System.print("Not found")
} else if (response.statusCode >= 500) {
System.print("Server error: %(response.statusCode)")
} else {
System.print("Error: %(response.statusCode)")
}</ code ></ pre >
< h2 > Access Response Headers</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/data")
System.print("Content-Type: %(response.headers["content-type"])")
System.print("All headers: %(response.headers)")</ code ></ pre >
< h2 > URL Query Parameters</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://api.example.com/search?q=wren& limit=10")
System.print(response.json)</ code ></ pre >
< h2 > Form URL Encoded POST</ h2 >
< pre >< code > import "http" for Http
var body = "username=john& password=secret"
var response = Http.post(
"https://api.example.com/login",
body,
{"Content-Type": "application/x-www-form-urlencoded"}
)
System.print(response.json)</ code ></ pre >
< h2 > Download File</ h2 >
< pre >< code > import "http" for Http
import "io" for File
var response = Http.get("https://example.com/file.txt")
if (response.statusCode == 200) {
File.write("downloaded.txt", response.body)
System.print("File downloaded!")
}</ code ></ pre >
< h2 > HTTPS Request</ h2 >
< pre >< code > import "http" for Http
var response = Http.get("https://secure.example.com/api")
System.print(response.body)</ code ></ pre >
< h2 > Error Handling</ h2 >
< pre >< code > import "http" for Http
var fiber = Fiber.new {
return Http.get("https://api.example.com/data")
}
var response = fiber.try()
if (fiber.error) {
System.print("Request failed: %(fiber.error)")
} else if (response.statusCode >= 400) {
System.print("HTTP error: %(response.statusCode)")
} else {
System.print("Success: %(response.json)")
}</ code ></ pre >
< h2 > Retry on Failure</ h2 >
< pre >< code > import "http" for Http
import "timer" for Timer
var fetchWithRetry = Fn.new { |url, maxRetries|
var attempt = 0
while (attempt < maxRetries ) {
var fiber = Fiber.new { Http . get ( url ) }
var response = fiber.try()
if (! fiber . error && response . statusCode = = 200 ) {
return response
}
attempt = attempt + 1
if ( attempt < maxRetries ) {
Timer . sleep ( 1000 * attempt )
}
}
return null
}
var response = fetchWithRetry.call("https://api.example.com/data", 3 )
if ( response ) {
System . print ( response . json )
} else {
System . print (" Failed after 3 retries ")
}</ code ></ pre >
< div class = "admonition tip" >
< div class = "admonition-title" > See Also</ div >
< p > For a complete API client example, see the < a href = "../tutorials/http-client.html" > HTTP Client Tutorial</ a > . For full API documentation, see the < a href = "../api/http.html" > HTTP module reference</ a > .</ p >
</ div >
</ article >
< footer class = "page-footer" >
< a href = "index.html" class = "prev" > How-To List</ a >
< a href = "json-parsing.html" class = "next" > JSON Parsing</ a >
</ footer >
</ main >
</ div >
< script src = "../js/main.js" ></ script >
</ body >
</ html >