如何在PostAsync上使用一个已经urlencoded的字符串?



我正在使用我的计算机上的代理来获取我向特定主机发出的所有特定请求,并使用PostAsync将它们重新发送到服务器。正文看起来像这样:

string request_body = "jazoest=25476&fb_dtsg=NAcPrG47So0hD5mhwwRfxJpl2Ey0_MYGJ56i7hag-P_t9oHc4SRnzmg%3A27%3A1666973204&create_test_app=1&parent_app_id=851841869280804&basic_name=asdsa%20-%20Test2&__usid=6-Trkzn9iowut6h%3APrkzqwf7zns4o%3A0-Arkzq8is0tywz-RV%3D6%3AF%3D&__user=100047878717&__a=1&__dyn=7xeUmxa3-Q8zo9E4a2i5U4e1Fx-ewSxu68uxa2e1Ezobo9E984e0G8G6Ehw9-15wfO1YCwjE7R2o4U1eE4aUS1vw4iwBgaohzE2DwiUmwnEfo4a5Ey19zUuw9O0RE5a1qxa1XwnE2Lxiaw4qxa7o-3qazo8U3ywbS1bqo2Yw&__csr=&__req=1m&__hs=19303.BP%3Adevsite_pkg.2.0.0.0.0&dpr=1&__ccg=EXCELLENT&__rev=1006332&__s=v4ezlf%3%3Awrukmu&__hsi=7163345567570&__comet_req=0&lsd=x_LyfPf8wTksRdG&__aaid=96891893825&ajax_password=302o&confirmed=1"

,我把它存储在一个字符串变量(它已经urlencoded,因为我得到了它从一个请求)。问题是:我想做一个PostAsync与这个主体像这样:

var result = Client.PostAsync(baseAddress, request_body).Result;

,但我不能直接传递它,因为PostAsync需要HttpContent作为主体。我该如何"转换"?这是正确的格式吗?

由于希望实际创建FormUrlEncodedContent对象,因此需要解析现有数据。您可以使用HttpUtility.ParseQueryString (using System.Web;):

private static FormUrlEncodedContent ParseFormDataToContent(string value)
{
    var formValues = new List<KeyValuePair<string, string>>();
    var parsedValues = HttpUtility.ParseQueryString(value);
    foreach (var key in parsedValues.AllKeys)
    {
        // a=1&a=2&b=3 is valid, so we can have multiple values per key
        string[] parsedItemValues = parsedValues.GetValues(key);
        foreach (var val in parsedItemValues)
        {
            // add an entry for each key
            formValues.Add(new KeyValuePair<string, string>(key, val));
        }
    }
    // create a FormUrlEncodedContent from the list
    return new FormUrlEncodedContent(formValues);
}

用法:

FormUrlEncodedContent content = ParseFormDataToContent(request_body);
var result = await Client.PostAsync(baseAddress, content);

我的另一个建议是只使用值逐字创建一个StringContent对象:

StringContent content = new StringContent(request_body, System.Text.Encoding.UTF8, "application/x-www-url-form encoded");
var result = await Client.PostAsync(baseAddress, content);

最新更新