You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS平台Xamarin.Forms WebView URL编码表单提交实现求助

Xamarin.iOS 等效实现 URL 编码表单数据生成

以下是对应Swift代码的Xamarin.iOS C#实现,核心逻辑完全对齐原生Swift代码,最终返回NSData对象:

using Foundation;
using System.Text;

public NSData ToUrlEncodedForm()
{
    // 定义URL编码允许的字符集:字母数字 + -._~
    var allowedChars = NSCharacterSet.AlphanumericCharacterSet;
    allowedChars = allowedChars.AddCharacters("-._~");

    // 生成Hash(若未初始化)
    if (string.IsNullOrEmpty(Hash))
    {
        Hash = SHA256Firm.GetFirm(Ip, SecretKey, Comercio, SucursalComercio, Monto);
    }

    var formBuilder = new StringBuilder();

    // 添加基础字段
    AppendEncodedKeyValue(formBuilder, "Hash", Hash, allowedChars);
    AppendEncodedKeyValue(formBuilder, "TransaccionComercioId", TransaccionComercioId, allowedChars);
    AppendEncodedKeyValue(formBuilder, "COMERCIO", Comercio, allowedChars);

    // 处理Producto数组
    for (int i = 0; i < Producto?.Count; i++)
    {
        var productKey = $"Producto[{i}]";
        AppendEncodedKeyValue(formBuilder, productKey, Producto[i], allowedChars);
    }

    // 添加加密后字段
    AppendEncodedKeyValue(formBuilder, "Monto", AESEncrypter.EncryptString(Monto, SecretKey), allowedChars);
    AppendEncodedKeyValue(formBuilder, "SucursalComercio", AESEncrypter.EncryptString(SucursalComercio, SecretKey), allowedChars);
    AppendEncodedKeyValue(formBuilder, "CallbackCancel", AESEncrypter.EncryptString(CallbackCancel, SecretKey), allowedChars);
    // 最后一个字段不添加&,单独处理
    var callbackSuccessValue = AESEncrypter.EncryptString(CallbackSuccess, SecretKey);
    formBuilder.Append($"{EncodeString("CallbackSuccess", allowedChars)}={EncodeString(callbackSuccessValue, allowedChars)}");

    // 转成NSData
    var formString = formBuilder.ToString();
    return NSData.FromString(formString, NSStringEncoding.UTF8);
}

// 辅助方法:拼接编码后的键值对(自动添加&)
private void AppendEncodedKeyValue(StringBuilder builder, string key, string value, NSCharacterSet allowedChars)
{
    var encodedKey = EncodeString(key, allowedChars);
    var encodedValue = EncodeString(value, allowedChars);
    builder.Append($"{encodedKey}={encodedValue}&");
}

// 辅助方法:对字符串进行URL编码
private string EncodeString(string input, NSCharacterSet allowedChars)
{
    if (string.IsNullOrEmpty(input))
        return string.Empty;
    
    var nsString = new NSString(input);
    return nsString.AddingPercentEncoding(allowedChars);
}

关键注意点:

  • 字符集对齐:Swift中的CharacterSet.alphanumerics对应Xamarin.iOS的NSCharacterSet.AlphanumericCharacterSet,通过AddCharacters方法添加-._~,确保编码规则完全一致。
  • 编码方法:使用NSString.AddingPercentEncoding实现与SwiftaddingPercentEncoding完全相同的URL编码逻辑。
  • 字段处理:最后一个字段单独拼接,避免末尾多一个&符号,保证表单格式正确。
  • 依赖方法:代码中假设你已经实现了C#版本的SHA256Firm.GetFirm和AESEncrypter.EncryptString,需确保这两个方法的逻辑与Swift原生版本完全一致(比如SHA256签名的哈希算法、AES加密的模式/密钥长度等)。

集成到WebView POST请求

生成NSData后,可在自定义WkWebViewRenderer中通过WKWebView.LoadRequest加载POST请求:

var request = new NSMutableUrlRequest(new NSUrl("你的POST地址"));
request.HttpMethod = "POST";
request.Body = ToUrlEncodedForm();
request["Content-Type"] = "application/x-www-form-urlencoded";

WKWebView.LoadRequest(request);

内容的提问来源于stack exchange,提问作者SarPa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:13:21