此代码位于python
中dataParams = urllib.urlencode({
"name": "myname",
"id": 2,
})
dataReq = urllib2.Request('mylink', dataParams)
dataRes = urllib2.urlopen(dataReq)
现在我正在尝试将其转换为C#。到目前为止我只能这样做了
var dataParams = new FormUrlEncodedContent(
new KeyValuePair<string, string>[]
{
new KeyValuePair<string, string>("name", myname"),
new KeyValuePair<string, string>("id", "2"),
});
httpResponse = await httpClient.PostAsync(new Uri(dataString),dataParams);
httpResponseBody = await httpResponse.Content.ReadAsStringAsync();
但我的问题是发布内容,因为帖子数据需要是int和string.But我只能使用FormUrlEncodedContent以字符串格式发送数据。所以如何使用适当的参数发送post请求。
答案 0 :(得分:4)
我不确定post data needs to be both int and string
是什么意思,因为application/x-www-form-urlencoded基本上是一个包含字符串键值对的字符串。
因此,原始id
参数是字符串"2"
还是数字2
并不重要。
它的编码方式相同:name=mynameValue&id=2
因此您的代码没有任何问题。只需在原始ToString
值上使用int
方法即可获得其字符串表示形式:
var id = 2;
var dataParams = new FormUrlEncodedContent(
new KeyValuePair<string, string>[]
{
new KeyValuePair<string, string>("name", myname"),
new KeyValuePair<string, string>("id", id.ToString()),
});
你可以用这样的东西来urlencode复杂类型用更少的样板,它甚至看起来更像原始的python代码:
public static class HttpUrlEncode
{
public static FormUrlEncodedContent Encode(Object obj)
{
if (obj == null)
throw new ArgumentNullException("obj");
var props = obj
.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.ToDictionary(
prop =>
prop.Name,
prop =>
(prop.GetValue(obj, null) ?? String.Empty).ToString());
return new FormUrlEncodedContent(props);
}
}
var dataParams = HttpUrlEncode.Encode(
new
{
name = "myname",
id = 2
});
答案 1 :(得分:2)
如果你不介意一个小的库依赖,Flurl [披露:我是作者]使它像你的Python样本一样简洁和简洁,可能更多:
var dataParams = new {
name: "myname",
id: 2
};
var result = await "http://api.com".PostUrlEncodedAsync(dataParams).ReceiveString();
答案 2 :(得分:0)
如果您的数据包含数字和字符串值,则可以使用public Set<String> getGraphics() {
// Still needed as the constructor of LinkedHashSet will iterate
// over iGraphicSectors
synchronized (iGraphicSectors) {
return new LinkedHashSet<String>(iGraphicSectors);
}
}
,它应接受您的任何数据。所以你的代码可能是:
KeyValuePair<string,object>