背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

简介: 原文:背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互[源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMeth...
原文: 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载]


背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互



作者:webabcd


介绍
背水一战 Windows 10 之 控件(WebView)

  • 加载指定 HttpMethod 的请求
  • 自定义请求的 http header
  • app 与 js 的交互



示例
1、演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http header
WebApi/Controllers/WebViewPostController.cs

/*
 * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自定义请求的 http header”
 */

using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace WebApi.Controllers
{
    public class WebViewPostController : ApiController
    {
        [HttpPost]
        public async Task<HttpResponseMessage> Post()
        {
            Stream stream = await this.Request.Content.ReadAsStreamAsync();
            StreamReader sr = new StreamReader(stream);
            string postData = sr.ReadToEnd();
            sr.Dispose();

            string myHeader = this.Request.Headers.GetValues("myHeader").FirstOrDefault();

            HttpResponseMessage result = new HttpResponseMessage
            {
                Content = new StringContent($"post data: {postData}<br /> myHeader: {myHeader}", Encoding.UTF8, "text/html")
            };

            return result;
        }
    }
}

Controls/WebViewDemo/WebViewDemo3.xaml

<Page
    x:Class="Windows10.Controls.WebViewDemo.WebViewDemo3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.WebViewDemo"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 0 0">

            <WebView Name="webView" Width="800" Height="300" HorizontalAlignment="Left" />

        </StackPanel>
    </Grid>
</Page>

Controls/WebViewDemo/WebViewDemo3.xaml.cs

/*
 * WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
 *     
 *     
 * 本例用于演示 
 * 1、WebView 如何加载指定 HttpMethod 的请求
 * 2、WebView 如何自定义请求的 http header
 */
 
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Web.Http;

namespace Windows10.Controls.WebViewDemo
{
    public sealed partial class WebViewDemo3 : Page
    {
        public WebViewDemo3()
        {
            this.InitializeComponent();

            this.Loaded += WebViewDemo3_Loaded;
        }

        private void WebViewDemo3_Loaded(object sender, RoutedEventArgs e)
        {
            // 实例化 HttpRequestMessage(可以指定请求的 HttpMethod 以及自定义请求的 http header)
            HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("http://localhost:44914/api/webviewpost"));

            // 构造 post 数据
            httpRequestMessage.Content = new HttpStringContent("hello webabcd");

            // 自定义 http header
            httpRequestMessage.Headers.Append("myHeader", "hello header");

            // 通过 NavigateWithHttpRequestMessage 加载指定的 HttpRequestMessage 对象
            webView.NavigateWithHttpRequestMessage(httpRequestMessage);
        }
    }
}


2、演示 app 与 js 的交互
Controls/WebViewDemo/WebViewJavaScript.html

<!--此 html 用于演示 app 与 js 间的交互-->

<!doctype html>
<html>
<head>
    <title>i am title</title>
    <script type='text/javascript'>

        // app 调用 js 函数
        function appToJs(name) {
            return 'app to js: ' + name;
        }

        // js 传递数据到 app
        function jsToApp() {
            window.external.notify('js to app');
        }

    </script>
</head>
<body>
    <input type='button' onclick='jsToApp();' value='js 传递数据到 app' />
</body>
</html>

Controls/WebViewDemo/WebViewDemo4.xaml

<Page
    x:Class="Windows10.Controls.WebViewDemo.WebViewDemo4"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.WebViewDemo"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="lblMsg" Margin="5" />

            <Button Name="btnAppToJavaScript" Content="app 调用 WebView 加载的 html 中的 JavaScript 函数" Click="btnAppToJavaScript_Click" Margin="5" />

            <Button Name="btnEval" Content="通过 eval 访问 DOM" Click="btnEval_Click" Margin="5" />

            <Button Name="btnRegisterJavaScript" Content="通过 eval 向 html 注册 JavaScript 脚本" Click="btnRegisterJavaScript_Click" Margin="5" />

            <!--
                通过 ms-appx-web 加载包内的 html 页面
            -->
            <WebView Name="webView" Width="480" Height="320" Source="ms-appx-web:///Controls/WebViewDemo/WebViewJavaScript.html" HorizontalAlignment="Left" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Controls/WebViewDemo/WebViewDemo4.xaml.cs

/*
 * WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
 *     InvokeScriptAsync() - 调用指定的 js 函数,并返回 js 函数的返回值
 *     ScriptNotify - 收到 js 通过 window.external.notify('') 传递过来的数据时触发的事件
 *     AllowedScriptNotifyUris - 允许触发 ScriptNotify 事件的 uri 列表
 *
 * 
 * 本例用于演示 app 与 js 的交互
 * 
 * 注意:关于如何将 windows runtime component 中定义的对象注册到 WebView 加载的页面,以便通过 js 调用 winrt,请参见 WebViewDemo8.xaml.cs 中的相关示例
 */

/*
 * 特别注意:各种 uri schema 对于 ScriptNotify 的支持情况如下
 * 1、http:// 不支持
 * 2、https:// 支持,需要在 appxmanifest 中设置允许的 URI(http 的不行,只能是 https 的),也可以通过 WebView 的 AllowedScriptNotifyUris 属性来设置或获取
 *    <ApplicationContentUriRules>
 *       <Rule Match="https://aaa.aaa.aaa" Type="include" />
 *    </ApplicationContentUriRules>
 * 3、ms-appdata:/// 不支持
 * 4、ms-appx-web:/// 支持
 * 5、ms-local-stream:// 支持
 */

using System;
using System.Collections.Generic;
using Windows.UI;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.WebViewDemo
{
    public sealed partial class WebViewDemo4 : Page
    {
        public WebViewDemo4()
        {
            this.InitializeComponent();

            webView.ScriptNotify += webView_ScriptNotify;
            webView.NavigationCompleted += webView_NavigationCompleted;
        }

        void webView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
        {
            if (args.IsSuccess)
            {
                // 获取 html 标题
                lblMsg.Text = "html title: " + webView.DocumentTitle;
                lblMsg.Text += Environment.NewLine;

                // 获取或设置 html 背景色
                webView.DefaultBackgroundColor = Colors.Orange;
                lblMsg.Text += "html backgroundColor: " + webView.DefaultBackgroundColor.ToString();
            }
        }

        // 收到 js 通过 window.external.notify('') 传递过来的数据时触发的事件
        private async void webView_ScriptNotify(object sender, NotifyEventArgs e)
        {
            // e.Value - 获取 js 传递过来的数据
            // e.CallingUri - 触发此事件的页面的 uri

            await new MessageDialog(e.CallingUri.ToString() + " " + e.Value).ShowAsync();
        }

        // app 调用 js
        private async void btnAppToJavaScript_Click(object sender, RoutedEventArgs e)
        {
            List<string> arguments = new List<string> { "webabcd" };
            // 调用 js 方法:sayHelloToJs('webabcd'); 并返回结果
            string result = await webView.InvokeScriptAsync("appToJs", arguments);

            await new MessageDialog(result).ShowAsync();
        }

        // 通过 eval 访问 DOM
        private async void btnEval_Click(object sender, RoutedEventArgs e)
        {
            // 设置 document.title 的值(用于演示如何通过 eval 设置 DOM)
            List<string> arguments = new List<string> { "document.title = 'hahaha';" };
            await webView.InvokeScriptAsync("eval", arguments);

            // 获取 document.title 的值(用于演示如何通过 eval 获取 DOM)
            arguments = new List<string> { "document.title;" };
            string result = await webView.InvokeScriptAsync("eval", arguments);
            await new MessageDialog(result).ShowAsync();
        }

        // 通过 eval 向 html 注册 JavaScript 脚本
        private async void btnRegisterJavaScript_Click(object sender, RoutedEventArgs e)
        {
            // 向 html 注册脚本
            List<string> arguments = new List<string> { "function xxx(){return '由 app 向 html 注册的脚本返回的数据';}" };
            await webView.InvokeScriptAsync("eval", arguments);

            // 调用刚刚注册的脚本
            string result = await webView.InvokeScriptAsync("xxx", null);

            await new MessageDialog(result).ShowAsync();
        }
    }
}

 



OK
[源码下载]

目录
相关文章
|
11月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
1001 130
|
12月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
912 2
|
JSON JavaScript API
Python模拟HTTP请求实现APP自动签到
Python模拟HTTP请求实现APP自动签到
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
缓存 JavaScript 前端开发
Vue 3 HTTP请求封装导致响应结果无法在浏览器中获取,尽管实际请求已成功。
通过逐项检查和调试,最终可以定位问题所在,修复后便能正常在浏览器中获取响应结果。
437 0
|
Web App开发 前端开发 Android开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
使用MAT分析内存泄露 对于大型服务端应用程序来说,有些内存泄露问题很难在测试阶段发现,此时就需要分析JVM Heap Dump文件来找出问题。
1024 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
系统的升级涉及各个架构组件,细节很多。常年累月的修修补补使老系统积累了很多问题。 系统升级则意味着需要repair之前埋下的雷,那为何还要升级,可以考虑以下几个方面 成熟老系统常见问题: 1. 缺乏文档(这应该是大小公司都存在的问题。
789 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。
1592 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block  解决办法:Hbase侧配置的dfs.socket.timeout值过小,与DataNode侧配置的 dfs.socket.timeout的配置不一致,将hbase和datanode的该配置调成大并一致。
1004 0