Skip to content

Network Requests

One of Lune’s most useful libraries is the networking library, also known as net. This library lets you access the internet and make HTTP requests to different websites, servers, and external APIs.

Sending HTTP requests is the most basic function of the net library. Let’s make a script called googler.luau:

local net = require("@lune/net")
local response = net.request("https://google.com")
if response.ok then
print(
"Google responded with status code",
response.statusCode,
"and response message",
response.statusMessage,
"!"
)
else
print("Google is down!! What?!?")
end

Now you can place this script in your current directory, and run it using Lune:

Terminal window
lune run googler

JSON, or JavaScript Object Notation, is the most common format for sending data over the network. Lune includes APIs for serializing & deserializing JSON, also known as stringifying & parsing, in the net library. Let’s use the free testing web API at https://jsonplaceholder.typicode.com/ and send + receive some JSON data:

print("Sending PATCH request to web API")
local apiResponse = net.request({
url = "https://jsonplaceholder.typicode.com/posts/1",
method = "PATCH",
headers = {
["Content-Type"] = "application/json",
},
body = serde.encode("json", {
title = "foo",
body = "bar",
}),
})
if not apiResponse.ok then
error(
string.format(
"%s\n%d (%s)\n%s",
"Failed to send network request!",
apiResponse.statusCode,
apiResponse.statusMessage,
apiResponse.body
)
)
end
type ResponseType = {
id: number,
title: string,
body: string,
userId: number,
}
local responseTable: ResponseType = serde.decode("json", apiResponse.body)
assert(responseTable.title == "foo", "Invalid json response")
assert(responseTable.body == "bar", "Invalid json response")
print("Got valid JSON response with post title set to 'foo' and post body set to 'bar'")
print("Full response:", responseTable)

Running the above script Lune should now send a request to the placeholder API, verify that the response was correct, and print it out:

Terminal window
lune run json-api

Bonus

Lune can not only perform network requests, it can also open a server on a given port and serve requests on it. Here’s a small example:

local net = require("@lune/net")
local counter = 0
net.serve(8080, function()
counter += 1
return {
status = 200,
body = "Hello! This is response #" .. tostring(counter),
}
end)
print("Listening on port 8080 🚀")

Just like before, you can place this script in your current directory, and run it using Lune:

Terminal window
lune run network-server

Now, when you visit http://localhost:8080/ you should see the response text above and the counter increasing each time you visit the page.