Динамическое обслуживание контента с использованием параметра directory для запросов GET - полка dart

Приведенные ниже фрагменты кода получены с сервера, обслуживающего запрос на получение.

Фрагменты сервера

1)

  io.serve(handler, InternetAddress.LOOPBACK_IP_V4, 8080).then((server) {
    print('Listening on port 8080');
  }).catchError((error) => print(error));

2)

Router routes = new Router()
                      ..get('/newest', handler.handleNewest)
                      ..get('/anonymous', handler.handleAnonymousGetRequest)
                      ..post('/anonymous', handler.handleAnonymousPostRequest);

3)

shelf.Response handleNewest(shelf.Request request){
  print('got request for newest');
  return new shelf.Response.ok('sample content later fetched form db');
}

По событию клика я также запускаю этот код в клиентском приложении.

void makeRequestNewest() {
  String path = 'http://127.0.0.1:8080/newest';
  HttpRequest.getString(path)
    .then((String newestContent){
    post_list.appendText(newestContent);
  })
  .catchError((Error error){
    post_list.appendText('an error occurred: ' + error.toString());
  });

к сожалению getString не удачно. catchError запускается и приводит к an error occurred: Instance of '_XMLHttpRequestProgressEvent', Также в командной строке ToolsOutput Dart Editor я получаю [web] GET /newest => Could not find asset linkShepherdClient|web/newest., Это правильно, потому что этот каталог не существует. Я думал, что могу использовать каталог в качестве параметра для запуска правильного обработчика и вернуть правильное значение в .ok(), но это не так. Означает ли это, что я не могу получить данные из любого источника, используя запрос GET, потому что он всегда будет пытаться получить их из этого каталога на сервере?

Изменить: пример кода с использованием пакета http. (не работает)

import 'package:http/http.dart' as http;
import 'package:http/browser_client.dart';

void makeRequestNewest() {
  String path = 'http://127.0.0.1:8080/newest';
  var client = new BrowserClient();
  client.get(path)
    .then((response){
    post_list.appendText('response status: ${response.statusCode}');
    post_list.appendText('Response body: ${response.body}');
  });
}

Ответ с использованием дополнительных пакетов, таких как пакет http, также очень приветствуется.

1 ответ

Решение

Я понял. Я пытался получить доступ к ресурсам из другого домена (localhost:8080 и не localhost:8080/newest). Это требует установки заголовка CORS в shelf.response, Это сделано, например, так

shelf.Response.ok('Message returned by handleNewest later fetched by db', headers: CORSHeader);

где CORSHeader установлен в

const Map<String, String> CORSHeader = const {'Access-Control-Allow-Origin': '*'};

Если вы хотите иметь доступ к контенту из любого домена. Вы также можете заменить звездочку доменом, доступ к которому вы хотите ограничить.

Другие вопросы по тегам