【问题标题】:Dart Empty response sent by client HttpRequest客户端 HttpRequest 发送的 Dart Empty 响应
【发布时间】:2016-01-20 14:57:58
【问题描述】:

我正在尝试在 Dart Web 客户端中查询 OrientDB,它似乎发送了一个空响应。这是我的 main.dart:

import 'dart:html';
// import 'dart:async';
import 'dart:convert';

main() {
 // querySelector('#output').text = 'Your Dart app is running.';
  HttpRequest.request("http://localhost:2480/listDatabases", 
      method: 'GET', requestHeaders: 
          {'Access-Contol-Allow-Origin': '*'})
  .then((req) => req.onReadyStateChange.where((e) => 
      req.readyState == HttpRequest.DONE).first
  .then((e) {
    var resp = req.responseText;
    querySelector('#output').text = "${req.status}";
    Map json = JSON.decode(resp);
    var ul = querySelector('#dblist');
    for (var db in json['databases']) {
      var li = new LIElement();
      li.appendText(db);
      ul.append(li);
    }
  }));
}

这是我的 index.html:

<!DOCTYPE html>

<!--
  Copyright (c) 2015, <your name>. All rights reserved. Use of this source code
  is governed by a BSD-style license that can be found in the LICENSE file.
-->

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="scaffolded-by" content="https://github.com/google/stagehand">
    <title>WebDbList1</title>
    <link rel="stylesheet" href="styles.css">
    <script async src="main.dart" type="application/dart"></script>
    <script async src="packages/browser/dart.js"></script>
</head>

<body>

  <div id="output"></div>
  <ul id="dblist">

  </ul>

</body>
</html>

如果对OrientDB专用代码有任何疑问,下面成功检索一个数据库列表...

import 'dart:io';
import 'dart:async';
import 'dart:convert';

const String database = "dosdart1";

main(List<String> args) async {
  List dblist = new List();
  String firstName, lastName;
  print("First name?");
  firstName = stdin.readLineSync();
  print("Last name?");
  lastName = stdin.readLineSync();
  print("You entered $firstName $lastName");
  dblist = await ListDatabases();
  print("received $dblist");

  // send GET http://localhost:2480/listDatabases
  /*
  HttpClient client = new HttpClient();
  client.getUrl(Uri.parse("http://localhost:2480/listDatabases"))
  .then((HttpClientRequest request) {
    return request.close();
  }).then((HttpClientResponse response) {
    response.transform(UTF8.decoder).listen((contents) {
      print("$contents");
      Map json = JSON.decode(contents);
      List dblist = json["databases"];
      if (dblist.contains("dosdart1")) {
        print("database exists");
      } else {
        print("Creating database...");

      }
      print("Found $dblist");

    });
  });
  */
}

Future<List> ListDatabases() {
  var completer = new Completer();
  List dblist = new List();

  HttpClient client = new HttpClient();
  client.getUrl(Uri.parse("http://localhost:2480/listDatabases"))
  .then((HttpClientRequest request) {
    return request.close();
  }).then((HttpClientResponse response) {
    response.transform(UTF8.decoder).listen((contents) {
      //    print("$contents");
      Map json = JSON.decode(contents);
      print("$json");
      for (var db in json['databases']) {
        dblist.add(db);
        print("$db");
      }
    //  print("$dblist");
      completer.complete(dblist);
    });
  });
  return completer.future;


}

我要做的是从 OreintDB 检索现有数据库的列表并将其显示在我的浏览器上。我可以在该命令行应用程序中实现这一目标,但我在 Web 客户端中一直失败。有什么建议?我的代码编译正常,但我得到的只是 Dartium 上的一个空白网页。

【问题讨论】:

  • 如果你直接在浏览器的 url 栏中输入这个 url localhost:2480/listDatabases 你会得到预期的响应吗?
  • 我想知道你为什么在客户端设置“Access-Contol-Allow-Origin”标头,你应该在服务器端设置它。也许您遇到了相同的来源政策?
  • 我在标题中拼错了“控制”,但修复该错字并不能解决问题。在这种情况下,除了 OrientDB 数据库服务器之外,没有“服务器”。在浏览器中输入“localhost:2480/listDatabases”可以获得所需的结果。我正在尝试使用 OrientDB 的 REST 接口。
  • @Fox32 我试图避免“同源策略”问题。
  • @RossAlbertson 您必须在服务器端配置“Access-Control-Allow-Origin”。你可以在这里找到解释:groups.google.com/d/msg/orient-database/vjOoxKwNv34/…

标签: dart httprequest orientdb dart-html


【解决方案1】:

我实现了我得到的配置 XML 修复,将我的 div 标签更改为 ul,下面的 Dart 给了我我的 OrientDB 数据库列表

import 'dart:html';
import 'dart:convert';

void main() {
  var root = querySelector('#output') as UListElement;
  HttpRequest.getString("http://localhost:2480/listDatabases").then((content) {
    var raw = JSON.decode(content);
    List databases = raw['databases'];
    for (String database in databases) {
      var li = new LIElement();
      li.appendText(database);
      root.append(li);
    }
  });
}

我在 orient-server-config.xml 中插入了以下内容:

<parameter value="Access-Control-Allow-Origin: http://localhost:63342;Access-Control-Allow-Credentials: true;Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Origin;Access-Control-Allow-Methods: POST, GET, OPTION" name="network.http.additionalResponseHeaders"/>

【讨论】:

  • @Fox32 抱歉!我想出了如何像你说的那样配置 OrientDB,我的代码给出了响应 {"@type":"d","@version":0,"databases":["GratefulDeadConcerts"],"@fieldTypes":" databases=e"} 我的新 Dart 代码是 import 'dart:html'; main() async { // querySelector('#output').text = '你的 Dart 应用正在运行。'; var request = await HttpRequest.request('localhost:2480/listDatabases', mimeType: "application/json"); querySelector('#output').text = request.responseText; } 而我的新配置 XML 是
  • 我的新 XML 是 &lt;parameters&gt; &lt;parameter name="network.http.additionalResponseHeaders" value="Access-Control-Allow-Origin: http://localhost:63342;Access-Control-Allow-Credentials: true;Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Origin;Access-Control-Allow-Methods: POST, GET, OPTION" /&gt; &lt;parameter value="utf-8" name="network.http.charset"/&gt; &lt;parameter value="true" name="network.http.jsonResponseError"/&gt; &lt;/parameters&gt;
  • 在前面提到的配置hack之后,下面的Dart代码得到了预期的结果:import 'dart:html'; import 'dart:convert'; void main() { var root = querySelector('#output') as UListElement; HttpRequest.getString("http://localhost:2480/listDatabases").then((content) { var raw = JSON.decode(content); List databases = raw['databases']; ...
猜你喜欢
  • 2017-08-11
  • 2018-10-12
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多