Skip to content

Instantly share code, notes, and snippets.

@suragch
Last active December 18, 2023 19:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suragch/b5d553dabfaa8edaeac7143d7b2d15ef to your computer and use it in GitHub Desktop.
Save suragch/b5d553dabfaa8edaeac7143d7b2d15ef to your computer and use it in GitHub Desktop.
Routing HTTP requests in a Dart server
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final server = await createServer();
print('Server started: ${server.address} port ${server.port}');
await handleRequests(server);
}
Future<HttpServer> createServer() async {
final address = InternetAddress.loopbackIPv4;
const port = 4040;
return await HttpServer.bind(address, port);
}
Future<void> handleRequests(HttpServer server) async {
await for (HttpRequest request in server) {
switch (request.method) {
case 'GET':
handleGet(request);
break;
case 'POST':
handlePost(request);
break;
default:
handleDefault(request);
}
}
}
var myStringStorage = 'Hello from a Dart server';
const fruit = ['apple', 'banana', 'peach', 'pear'];
/// GET requests
void handleGet(HttpRequest request) {
final path = request.uri.path;
switch (path) {
case '/fruit':
handleGetFruit(request);
break;
case '/vegetables':
handleGetVegetables(request);
break;
default:
handleGetOther(request);
}
}
void handleGetFruit(HttpRequest request) {
final queryParams = request.uri.queryParameters;
// Return all fruit if there are no query parameters
if (queryParams.isEmpty) {
final jsonString = jsonEncode(fruit);
request.response
..statusCode = HttpStatus.ok
..write(jsonString)
..close();
return;
}
// Find any fruit that start with the 'prefix'
final prefix = queryParams['prefix'];
final matches = fruit
.where(
(item) => item.startsWith(prefix),
).toList();
// Respond based on the matches found
if (matches.isEmpty) {
request.response
..statusCode = HttpStatus.notFound
..close();
} else {
final jsonString = jsonEncode(matches);
request.response
..statusCode = HttpStatus.ok
..write(jsonString)
..close();
}
}
void handleGetVegetables(HttpRequest request) {
request.response
..statusCode = HttpStatus.ok
..write(myStringStorage)
..close();
}
void handleGetOther(HttpRequest request) {
request.response
..statusCode = HttpStatus.badRequest
..close();
}
/// POST requests
Future<void> handlePost(HttpRequest request) async {
myStringStorage = await utf8.decoder.bind(request).join();
request.response
..write('Got it. Thanks.')
..close();
}
/// Other HTTP method requests
void handleDefault(HttpRequest request) {
request.response
..statusCode = HttpStatus.methodNotAllowed
..write('Unsupported request: ${request.method}.')
..close();
}
@happy-san
Copy link

I was stuck on figuring out a way to decode the request. Thank you.

myStringStorage = await utf8.decoder.bind(request).join();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment