【发布时间】: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