c#从HttpClient的模型对象构建URL编码查询

时间:2017-11-24 05:16:50

标签: c# dotnet-httpclient

需要从HttpClient的模型对象构建URL编码查询

我的模特是

class SaveProfileRequest
{
    public string gName { get; set; }
    public string gEmail { get; set; }
    public long gContact { get; set; }
    public string gCompany { get; set; }
    public string gDeviceID { get; set; }
    public string Organization { get; set; }
    public string profileImage { get; set; }
    public string documentImagefront { get; set; }
    public string documentImageback { get; set; }
}

SaveProfileRequest request = new SaveProfileRequest() { gName = name, gEmail = email, gContact = phonenumber, gCompany = company,
            gDeviceID = deviceId, Organization = "", profileImage = "", documentImageback = "", documentImagefront = "" };

string response = await RequestProvider.PostAsync<string, SaveProfileRequest>(uri, request);

我有一个内容类型为JSON的工作代码

content = new StringContent(JsonConvert.SerializeObject(data));

content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

数据的类型为TInput

尝试

content = new StringContent(System.Net.WebUtility.UrlEncode(JsonConvert.SerializeObject(data)));

content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

但没有锻炼

3 个答案:

答案 0 :(得分:6)

JsonConvert仅生成json内容。对于urlencoded查询,您应该构造FormUrlEncodedContent的实例。作为构造函数参数,它需要收集KeyValuePair<string, string>。因此,主要技巧是为模型对象构建此集合。

您可以将反射用于此目的。但是有一个基于Json.net的简单解决方案。它被描述为here,而ToKeyValue()跟随public static class ObjectExtensions { public static IDictionary<string, string> ToKeyValue(this object metaToken) { if (metaToken == null) { return null; } JToken token = metaToken as JToken; if (token == null) { return ToKeyValue(JObject.FromObject(metaToken)); } if (token.HasValues) { var contentData = new Dictionary<string, string>(); foreach (var child in token.Children().ToList()) { var childContent = child.ToKeyValue(); if (childContent != null) { contentData = contentData.Concat(childContent) .ToDictionary(k => k.Key, v => v.Value); } } return contentData; } var jValue = token as JValue; if (jValue?.Value == null) { return null; } var value = jValue?.Type == JTokenType.Date ? jValue?.ToString("o", CultureInfo.InvariantCulture) : jValue?.ToString(CultureInfo.InvariantCulture); return new Dictionary<string, string> { { token.Path, value } }; } } 扩展方法是来自该博客帖子的复制/粘贴:

var keyValues = data.ToKeyValue();
var content = new FormUrlEncodedContent(keyValues);

现在,您可以轻松构建网址编码的内容:

{(x,y)| -30x+28<= y && 60x+2 <= y <= 90x+7}

答案 1 :(得分:2)

这可以通过Flurl毫不费力地完成(免责声明:我是作者),因为这个确切的场景 - 将.NET对象的属性解析为URL编码的键值对 - 在框中支持:

using Flurl.Http;

var resp = await url.PostUrlEncodedAsync(data);

Flurl使用了HttpClient,因此在上面的示例中,respHttpResponseMessage的实例,就像直接使用HttpClient进行调用一样。如果您只想要响应主体,也可以将.ReceiveString()附加到调用中;如果您希望获得JSON响应并且想要匹配类型为.ReceiveJson<T>()的.NET对象,则可以T。< / p>

答案 2 :(得分:0)

您可以使用此简化版

public static class URLExtensions
{
    public static string ToKeyValueURL(this object obj)
    {
        var keyvalues = obj.GetType().GetProperties()
            .ToList()
            .Select(p => $"{p.Name} = {p.GetValue(obj)}")
            .ToArray();

        return string.Join('&',keyvalues);
    }
}