使用GET请求的目录参数动态提供内容 - shelf package dart

时间:2015-05-17 17:35:30

标签: get dart dart-shelf

以下代码段来自提供请求的服务器

服务器代码段

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'。 同样在Dart编辑器的ToolsOutput命令行中,我得到[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 个答案:

答案 0 :(得分:0)

我明白了。我尝试从其他域(localhost:8080而不是localhost:8080/newest)访问资源。这需要在shelf.response中设置CORS header。这样做就像那样

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

其中CORSHeader设置为

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

如果您想要访问任何域中的内容。您还可以使用要限制访问权限的域替换星号。