在 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¶m2=2");
//Now set tyhe URL to navigate
postView.PostUrl = "http://myserver.com/my/post/url";
如果您需要在创建控件之前将其与 XAML 绑定或设置 PostUrl
您将需要挂钩 ElementChanged
事件,检查 PostUrl
属性 如果已设置,则调用 Android WebView 的 PostUrl
方法。
我正在开发一个使用 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¶m2=2");
//Now set tyhe URL to navigate
postView.PostUrl = "http://myserver.com/my/post/url";
如果您需要在创建控件之前将其与 XAML 绑定或设置 PostUrl
您将需要挂钩 ElementChanged
事件,检查 PostUrl
属性 如果已设置,则调用 Android WebView 的 PostUrl
方法。