0

以下のコード スニペットは、get リクエストを処理するサーバーからのものです。

サーバー スニペット

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 Editor の 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 パッケージなどの追加パッケージを使用した回答も大歓迎です。

4

1 に答える 1

0

私はそれを考え出した。別のドメイン (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': '*'};

任意のドメインからコンテンツにアクセスしたい場合。スターを、アクセスを制限したいドメインに置き換えることもできます。

于 2015-05-18T19:30:41.527 に答える