Getting Started
Introduction
5 • Network Requests

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

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

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:

Bash
lune run googler

Sending JSON Requests

JSON (opens in a new tab), 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/ (opens in a new tab) and send + receive some JSON data:

json-api.luau
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 = net.jsonEncode({
		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 = net.jsonDecode(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:

Bash
lune run json-api

Bonus

Network Server

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:

network-server.luau
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:

Bash
lune run network-server

Now, when you visit http://localhost:8080/ (opens in a new tab) you should see the response text above and the counter increasing each time you visit the page.