在 WebView 中显示只接受 POST 方法的网站

Show website that only accepts POST method in a WebView

我正在开发一个使用 Xamarin 开发的移动应用程序,我在尝试在 WebView 中显示网站时遇到了问题。

  <WebView Grid.Column="0" Grid.Row="1" x:Name="webView" source="https://ecommerce.netpay.com.mx/a-webapp3/e-commerce/web-authorizer?checkoutTokenId=fc912ec2-5f20-4533-91cf-95db61d26822" WidthRequest="700" HeightRequest="700" />

当 运行 应用程序显示以下错误。我了解当我使用的方法不正确时会发生这种情况。

然后我在后面的代码中尝试了以下内容:

 private async Task urlAsync()
        {
            var client = new HttpClient();
            var url = "https://ecommerce.netpay.com.mx/a-webapp3/e-commerce/web-authorizer?checkoutTokenId=fc912ec2-5f20-4533-91cf-95db61d26822";
            var req = new HttpRequestMessage(HttpMethod.Post, url);
            var response = await client.SendAsync(req);
            var readAsStringAsync = response.Content.ReadAsStringAsync();
            var stringHtml = readAsStringAsync.Result;
            var html = new HtmlWebViewSource
            {
                Html = stringHtml
            };
            webView.Source = html;

        }

并且我从 WebView 标签中删除了 "source" 属性。但这并不能正常工作,因为网站没有完全加载。

最后我创建了一个 Web 项目并且成功了:

<html>
<body>

<form action="https://ecommerce.netpay.com.mx/a-webapp3/e-commerce/web-authorizer?checkoutTokenId=0a377ca8-e26c-4f22-a751-52719acf9019&checkoutDetail=true&MerchantResponseURL=aHR0cHM6Ly9nb29nbGUuY29t" method="POST" target="_blank">
  JWT: <input type="text" name="jwt"><br>
  <input type="submit" value="Submit">
</form>

<p>Haga clic en el botón Enviar y la entrada se enviará a una página del servidor llamada "/action_page.php".</p>

</body>
</html>

知道如何在 Xamarin 中实现它吗?谢谢。

您需要访问底层 Android WebView 的 PostUrl 方法。由于默认 WebView 未公开它,因此您需要创建派生的 webview 和自定义渲染器:

//Derived class in your forms project
public class PostWebView : WebView
{
    public static readonly BindableProperty PostUrlProperty =
    BindableProperty.Create(nameof(PostUrl), typeof(string), typeof(PostWebView), string.Empty, BindingMode.OneWay);

    public string PostUrl
    {
        get { return (string)GetValue(PostUrlProperty); }
        set { SetValue(PostUrlProperty, value); }
    }

    public byte[] PostData { get; set; } = new byte[0];
}

//Custom renderer on the native project
[assembly: ExportRenderer(typeof(PostWebView), typeof(PostWebViewRenderer))]
namespace (your project namespace).Droid
{
    public class PostWebViewRenderer : WebViewRenderer
    {
        public PostWebViewRenderer(Context ctx) : base(ctx) {  }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "PostUrl")
            {
                if (Control == null)
                    return;

                var web = (Android.Webkit.WebView)Control;
                var view = Element as PostWebView;
                web.PostUrl(view.PostUrl, view.PostData);
            }
        }
    }
}

现在您可以 POST 使用新的 属性 PostUrl 进行导航,此外,您还可以使用 [=14] POST 添加您需要的任何数据到服务器=].

//You can set it to new byte[0] if you don't need to send any data.
postView.PostData = Encoding.ASCII.GetBytes("param1=1&param2=2");
//Now set tyhe URL to navigate
postView.PostUrl = "http://myserver.com/my/post/url";

如果您需要在创建控件之前将其与 XAML 绑定或设置 PostUrl 您将需要挂钩 ElementChanged 事件,检查 PostUrl 属性 如果已设置,则调用 Android WebView 的 PostUrl 方法。