Last active
December 18, 2023 19:08
-
-
Save suragch/b5d553dabfaa8edaeac7143d7b2d15ef to your computer and use it in GitHub Desktop.
Routing HTTP requests in a Dart server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I was stuck on figuring out a way to decode the
request
. Thank you.myStringStorage = await utf8.decoder.bind(request).join();