使用 GET 请求的目录参数动态提供内容 - shelf package dart
Serving content dynamically using the directory parameter for GET requests - shelf package 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'
。
同样在 Dart 编辑器的 ToolsOutput 命令行中,我得到 [web] GET /newest => Could not find asset linkShepherdClient|web/newest.
。这是正确的,因为该目录不存在。我以为我可以使用目录作为 运行 正确处理程序的参数,return .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 包等其他包的答案。
我明白了。我试图从不同的域(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': '*'};
如果您想访问来自任何域的内容。您也可以将星号替换为您要限制访问的域。
下面的代码片段来自服务获取请求的服务器
服务器片段
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.
。这是正确的,因为该目录不存在。我以为我可以使用目录作为 运行 正确处理程序的参数,return .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 包等其他包的答案。
我明白了。我试图从不同的域(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': '*'};
如果您想访问来自任何域的内容。您也可以将星号替换为您要限制访问的域。