Url通过HttpClient编码HTTP Post的非字符串属性

时间:2017-01-12 18:18:57

标签: c# post urlencode dotnet-httpclient

此代码位于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请求。

3 个答案:

答案 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>