2017-01-12 5 views
2

Этот код находится в питонаUrlEncode свойства нестроковые для HTTP Post через HttpClient

dataParams = urllib.urlencode({ 
    "name": "myname",  
    "id": 2,   
    }) 

    dataReq = urllib2.Request('mylink', dataParams) 
    dataRes = urllib2.urlopen(dataReq) 

Теперь я пытаюсь преобразовать его в C# .Till теперь я был в состоянии сделать это только

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.So, как отправить отправку запроса с соответствующими параметрами.

ответ

3

Я не уверен, что вы имеете в виду 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 сложных типов с меньшими шаблонным, и это будет даже выглядеть как исходный код питона:

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 
    });  
+0

спасибо, что он работал только с первым методом. – Uwpbeginner

+0

Как именно он не работал со вторым подходом? Я пробовал это с помощью простого '[HttpPost] public ActionResult TestPost ( String name, Int32 id)' и действие получает правильные данные. –

+0

Нет, я хотел сказать, что я пробовал первый, и он работал, поэтому я не пробовал второй. :) – Uwpbeginner

0

Если ваши данные будут содержать как числовые, так и строковые значения, вы можете использовать KeyValuePair<string,object>, который должен принимать любые ваши данные. Так что ваш код может быть:

var contentString = JsonConvert.SerializeObject(
     new KeyValuePair<string, object>[] 
     { 
      new KeyValuePair<string, object>("name", "myname"),      
      new KeyValuePair<string, object>("id", 2), 
     }); 
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "URI") { 
    Content = new StringContent(contentString) 
}; 
httpResponse = await httpClient.SendAsync(requestMessage); 
+0

Я не вижу никаких [конструкторов] (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent (v = vs.118) .aspx) на 'FormUrlEncodedContent 'которые принимают' IEnumerable '. И единственный существующий конструктор (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent.formurlencodedcontent(v=vs.118).aspx) не примет такой параметр. –

+0

@EugenePodskal Вы правы, я думаю, это должно быть 'JsonConvert.SerializeObject', я отредактирую соответственно. –

+1

Нет, ему нужна стандартная кодировка [application/x-www-form-urlencoded] (http://stackoverflow.com/questions/14551194/how-are-parameters-sent-in-an-http-post-request). –

1

Если вы не возражаете, небольшую библиотеку зависимости, Flurl [раскрытие: Я автор] делает это как короткое и лаконичным в качестве образца Python, может быть, больше так:

var dataParams = new { 
    name: "myname", 
    id: 2 
}; 

var result = await "http://api.com".PostUrlEncodedAsync(dataParams).ReceiveString(); 
+0

спасибо за ваш ответ, в настоящее время это сработало для меня в следующий раз, я обязательно попробую вашу библиотеку. – Uwpbeginner

 Смежные вопросы

  • Нет связанных вопросов^_^