Add Http effect for making HTTP requests: - Http.get(url) - GET request - Http.post(url, body) - POST with string body - Http.postJson(url, json) - POST with JSON body - Http.put(url, body) - PUT request - Http.delete(url) - DELETE request Returns Result<HttpResponse, String> where HttpResponse contains status code, body, and headers. Includes reqwest dependency with blocking client, OpenSSL support in flake.nix, and example at examples/http.lux demonstrating API requests with JSON parsing. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
92 lines
3.4 KiB
Plaintext
92 lines
3.4 KiB
Plaintext
// HTTP example - demonstrates the Http effect
|
|
//
|
|
// This script makes HTTP requests and parses JSON responses
|
|
|
|
fn main(): Unit with {Console, Http} = {
|
|
Console.print("=== Lux HTTP Example ===")
|
|
Console.print("")
|
|
|
|
// Make a GET request to a public API
|
|
Console.print("Fetching data from httpbin.org...")
|
|
Console.print("")
|
|
|
|
match Http.get("https://httpbin.org/get") {
|
|
Ok(response) => {
|
|
Console.print("GET request successful!")
|
|
Console.print(" Status: " + toString(response.status))
|
|
Console.print(" Body length: " + toString(String.length(response.body)) + " bytes")
|
|
Console.print("")
|
|
|
|
// Parse the JSON response
|
|
match Json.parse(response.body) {
|
|
Ok(json) => {
|
|
Console.print("Parsed JSON response:")
|
|
match Json.get(json, "origin") {
|
|
Some(origin) => match Json.asString(origin) {
|
|
Some(ip) => Console.print(" Your IP: " + ip),
|
|
None => Console.print(" origin: (not a string)")
|
|
},
|
|
None => Console.print(" origin: (not found)")
|
|
}
|
|
match Json.get(json, "url") {
|
|
Some(url) => match Json.asString(url) {
|
|
Some(u) => Console.print(" URL: " + u),
|
|
None => Console.print(" url: (not a string)")
|
|
},
|
|
None => Console.print(" url: (not found)")
|
|
}
|
|
},
|
|
Err(e) => Console.print("JSON parse error: " + e)
|
|
}
|
|
},
|
|
Err(e) => Console.print("GET request failed: " + e)
|
|
}
|
|
|
|
Console.print("")
|
|
Console.print("--- POST Request ---")
|
|
Console.print("")
|
|
|
|
// Make a POST request with JSON body
|
|
let requestBody = Json.object([("message", Json.string("Hello from Lux!")), ("version", Json.int(1))])
|
|
Console.print("Sending POST with JSON body...")
|
|
Console.print(" Body: " + Json.stringify(requestBody))
|
|
Console.print("")
|
|
|
|
match Http.postJson("https://httpbin.org/post", requestBody) {
|
|
Ok(response) => {
|
|
Console.print("POST request successful!")
|
|
Console.print(" Status: " + toString(response.status))
|
|
|
|
// Parse and extract what we sent
|
|
match Json.parse(response.body) {
|
|
Ok(json) => match Json.get(json, "json") {
|
|
Some(sentJson) => {
|
|
Console.print(" Server received:")
|
|
Console.print(" " + Json.stringify(sentJson))
|
|
},
|
|
None => Console.print(" (no json field in response)")
|
|
},
|
|
Err(e) => Console.print("JSON parse error: " + e)
|
|
}
|
|
},
|
|
Err(e) => Console.print("POST request failed: " + e)
|
|
}
|
|
|
|
Console.print("")
|
|
Console.print("--- Headers ---")
|
|
Console.print("")
|
|
|
|
// Show response headers
|
|
match Http.get("https://httpbin.org/headers") {
|
|
Ok(response) => {
|
|
Console.print("Response headers (first 5):")
|
|
let count = 0
|
|
// Note: Can't easily iterate with effects in callbacks, so just show count
|
|
Console.print(" Total headers: " + toString(List.length(response.headers)))
|
|
},
|
|
Err(e) => Console.print("Request failed: " + e)
|
|
}
|
|
}
|
|
|
|
let result = run main() with {}
|