2017-01-12 1 views
2

Ce code est en pythonUrlEncode propriétés non-chaîne pour HTTP Post par HttpClient

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

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

Maintenant, je suis en train de le convertir en C# .Till maintenant je suis en mesure de le faire que

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(); 

Mais mon problème est d'afficher le contenu puisque les données post doivent être à la fois int et chaîne.Mais je ne peux envoyer des données au format chaîne en utilisant FormUrlEncodedContent.So comment puis-je envoyer la demande de publication avec les paramètres appropriés.

Répondre

3

Je ne suis pas sûr de ce que vous entendez par post data needs to be both int and string, parce que application/x-www-form-urlencoded est essentiellement une chaîne avec chaîne paires clé-valeur.

Donc, ce n'est pas grave si votre paramètre id d'origine est une chaîne "2" ou un numéro 2.

Il sera encodée même: name=mynameValue&id=2

Donc, il n'y a rien de mal avec votre code. Il suffit d'utiliser la méthode ToString sur la valeur int originale pour obtenir sa représentation chaîne:

var id = 2; 
var dataParams = new FormUrlEncodedContent(
    new KeyValuePair<string, string>[] 
    { 
     new KeyValuePair<string, string>("name", myname"),      
     new KeyValuePair<string, string>("id", id.ToString()), 
    }); 

Vous pouvez faire quelque chose comme cela urlencode types complexes avec moins passe-partout, et il sera même regarder de plus comme le code python d'origine:

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

merci cela a fonctionné avec la première méthode seulement. – Uwpbeginner

+0

Comment exactement cela n'a-t-il pas fonctionné avec la deuxième approche? Je l'ai essayé avec simple '[HttpPost] public ActionResult TestPost ( nom de la chaîne, Int32 id)' et l'action reçoit des données correctes. –

+0

Non je voulais dire que j'ai essayé le premier et ça a marché donc je n'ai pas essayé le second. :) – Uwpbeginner

0

Si vos données contiennent à la fois des valeurs de nombre et de chaîne, vous pouvez utiliser un KeyValuePair<string,object>, qui doit accepter toutes vos données. Donc, votre code pourrait être:

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

Je ne vois aucun [constructeur] (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent (v = vs.118) .aspx) sur 'FormUrlEncodedContent 'qui accepte' IEnumerable '. Et le seul constructeur existant (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent.formurlencodedcontent(v=vs.118).aspx) n'acceptera pas ce paramètre. –

+0

@EugenePodskal Vous avez raison, je suppose que ce sera JsonConvert.SerializeObject, je vais modifier en conséquence. –

+1

Non, il a besoin du codage standard [application/x-www-form-urlencoded] (http://stackoverflow.com/questions/14551194/how-are-parameters-sent-in-an-http-post-request). –

1

Si vous ne me dérange pas une petite dépendance bibliothèque, Flurl [divulgation: Je suis l'auteur] fait la plus brève et succincte que votre exemple Python, peut-être plus encore:

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

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

merci pour votre réponse actuellement cela a fonctionné pour moi la prochaine fois que je vais sûrement essayer votre bibliothèque. – Uwpbeginner