我的问题很简单。如何从webview中加载的页面中获取html数据。数据为JSON格式。出于某种原因,我不能在这里对任何get请求使用post请求,因此我只需要使用webview获取数据。如何做到这一点?
flutterWebViewPlugin.onUrlChanged.listen((String url) {
if (url.contains('/recon?')) {
print('printing url : $url');
// need to get data ( html content ) on this url
flutterWebViewPlugin.close();
Navigator.of(context).pop(url);
}
});
});
WebviewScaffold(
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0",
url: myurl,
)
发布于 2020-09-13 14:35:29
对我来说,答案是从url而不是从html content
获取令牌,因为我不能正确地提取它并得到错误
[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: FormatException: Unexpected character (at character 1)
<html><head></head><body><pre style="word-wrap: break-word; white-space: pr...
^
因此,对于我来说,一开始起作用的是以下解决方案:
WebView(
userAgent: "random",
initialUrl: mainUrl,
onWebViewCreated: (controller) {
_controller = controller;
print(_controller.currentUrl());
},
javascriptMode: JavascriptMode.unrestricted,
gestureNavigationEnabled: true,
onPageFinished: (_) {
_controller.currentUrl().then(
(url) {
if (url.contains("recon?")) {
var token = url.split('recon?')[1];
_prefs.setString('token', token);
}
if (url.contains("dashboard")) {
_controller.clearCache();
_controller.loadUrl(mainUrl);
}
},
);
},
),
在这里,我们获取url,根据关键字将其拆分,然后存储另一半,即令牌并继续。我可以用两种方式做到这一点,也就是用flutter_webview_plugin
和flutter_inappwebview
,这是相同的过程,但网址的事情只对我有效。提取上下文没有这样做,所以它们不会被标记为答案,而是帮助我理解可能性的一张向上的选票。
发布于 2020-08-04 18:21:12
你可以通过官方的webview库来实现:
WebView(
initialUrl: model.luxtrustUrl,
onWebViewCreated: (controller) {
_controller = controller;
},
javascriptMode: JavascriptMode.unrestricted,
gestureNavigationEnabled: true,
onPageFinished: (_) {
readJS();
model.hideProgress();
},
)
void readJS() async{
String html = await _controller.evaluateJavascript("window.document.getElementsByTagName('html')[0].outerHTML;");
print(html);
}
发布于 2020-06-03 16:41:55
您可以使用my plugin flutter_inappwebview,它是一个Flutter插件,允许您添加内联WebViews或打开应用内浏览器窗口,它有许多事件、方法和选项来控制WebViews。
要获取超文本标记语言数据,只需在onLoadStop
事件中使用var html = await controller.evaluateJavascript(source: "window.document.getElementsByTagName('html')[0].outerHTML;");
即可。
下面是一个使用userAgent
的示例
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
InAppWebViewController webView;
String myurl = "https://github.com/flutter";
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('InAppWebView Example'),
),
body: Container(
child: Column(children: <Widget>[
Expanded(
child: InAppWebView(
initialUrl: myurl,
initialHeaders: {},
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
debuggingEnabled: true,
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0"
),
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
},
onLoadStop: (InAppWebViewController controller, String url) async {
if (url.contains('/recon?')) {
// if JavaScript is enabled, you can use
var html = await controller.evaluateJavascript(
source: "window.document.getElementsByTagName('html')[0].outerHTML;");
log(html);
}
},
))
])),
),
);
}
}
只需将myurl
变量设置为您的url。
通过window.document.getElementsByTagName('html')[0].outerHTML;
,你将获得所有的超文本标记语言字符串。相反,如果您只需要正文文本,则可以使用window.document.body.innerText;
更改它。
https://stackoverflow.com/questions/61044466
复制相似问题