Angular Dart - Как создать прокси-сервер для приложений Angular Dart?
Я хотел бы создать прокси-сервер для моих приложений angular-dart, который перенаправляет меня на index.html
всякий раз, когда я обновляю браузер и маршрут отличается от root. Например, если URL-адрес: http://localhost:8080/users
и я нажал кнопку обновления, я хотел бы быть перенаправлен на http://localhost:8080
или же http://localhost:8080/index.html
,
Кроме того, будет очень полезно иметь возможность подключаться к стороннему серверному приложению. Другими словами, я хотел бы запустить pub serve
и сторонний сервер (python, php или java), работающий на localhost:9000
1 ответ
Для этого мы могли бы использовать следующий код:
import 'dart:convert';
import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart';
import 'package:shelf_proxy/shelf_proxy.dart';
import 'package:shelf/src/message.dart' show getBody;
main() async {
_startPubServe();
var server = await serve(handler, 'localhost', 9080);
print('Proxying at http://${server.address.host}:${server.port}');
}
handler(Request request) {
// redirects all the `api` calls to the third party server
print('request.url.path: ${request.url.path}');
if (request.url.path.startsWith('api')) {
print('proxying to: http://localhost:3333/api');
return proxyHandler('http://localhost:3333/api')(request);
}
// redirects all files to default `pub serve` path
var handler = proxyHandler('http://localhost:8080');
if (new RegExp(r'\.(css|dart|html|png|ttf|otf|TTF)$').hasMatch(request.url.path)) {
print('proxyiing to: http://localhost:8080');
return handler(request);
}
// redirect all the routes to `index.html`
print('proxying to: http://localhost:8080/index.html');
return handler(new Request(
request.method,
Uri.parse('http://localhost:8080/index.html'),
protocolVersion: request.protocolVersion,
headers: request.headers,
handlerPath: request.handlerPath,
body: getBody(request),
encoding: request.encoding,
context: request.context));
}
// starts `pub serve` when running this server
_startPubServe() async {
String executable = Platform.isWindows ? 'pub.bat' : 'pub';
var process = await Process.start(executable, ['serve', '--port', '8080']);
process.stdout.transform(UTF8.decoder).listen(print);
}