需要从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");
但没有锻炼
答案 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
,因此在上面的示例中,resp
是HttpResponseMessage
的实例,就像直接使用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);
}
}