2017-01-12 2 views
2

Dieser Code in Python istUrlEncode Nicht-String-Eigenschaften für HTTP Post durch Httpclient

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

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

Jetzt versuche ich es in C# .Till zu konvertieren jetzt ich in der Lage gewesen, dies zu tun nur

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

Aber mein Problem ist den Inhalt zu veröffentlichen, da die Post-Daten sowohl int und String sein müssen.Aber ich kann nur Daten im String-Format senden mit FormUrlEncodedContent.So wie sende ich die Post-Anfrage mit den richtigen Parametern.

Antwort

3

Ich bin nicht sicher, was meinst du mit post data needs to be both int and string, weil application/x-www-form-urlencoded ist im Grunde ein String mit String-Schlüssel-Wert-Paaren.

Es spielt also keine Rolle, ob Ihr ursprünglicher id Parameter eine Zeichenfolge "2" oder eine Nummer 2 ist.

Es wird das gleiche codiert werden: name=mynameValue&id=2

So gibt es nichts falsch mit Ihrem Code ist. Verwenden Sie einfach ToString Methode auf original int Wert seine String-Darstellung zu erhalten:

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

Sie können so etwas wie dieses machen komplexe Typen mit weniger vorformulierten urlencode, und es wird noch mehr wie das Original Python-Code aussehen:

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

danke, es funktionierte nur mit der ersten Methode. – Uwpbeginner

+0

Wie genau hat es mit dem zweiten Ansatz nicht funktioniert? Ich habe es versucht mit einfachen '[HttpPost] öffentlichen ActionResult TestPost ( String-Name, Int32 ID)' und die Aktion erhält korrekte Daten. –

+0

Nein, ich wollte sagen, dass ich das erste versucht habe und es hat funktioniert, also habe ich das zweite nicht ausprobiert. :) – Uwpbeginner

0

Wenn Ihre Daten sowohl Zahlen- als auch Zeichenfolgenwerte enthalten, können Sie eine KeyValuePair<string,object> verwenden, die alle Ihre Daten akzeptieren sollte. So könnte Ihr Code sein:

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

Ich sehe keinen [Konstrukteurs] (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent (v = vs.118) .aspx) auf 'FormUrlEncodedContent 'das akzeptiert' IEnumerable '. Und der einzelne existierende Konstruktor (https://msdn.microsoft.com/en-us/library/system.net.http.formurlencodedcontent.formurlencodedcontent(v=vs.118).aspx) akzeptiert solche Parameter nicht. –

+0

@EugenePodskal Sie haben Recht, ich denke, es muss 'JsonConvert.SerializeObject' sein, ich werde entsprechend bearbeiten. –

+1

Nein, er benötigt die Standardcodierung [application/x-www-form-urlencoded] (http://stackoverflow.com/questions/14551194/how-are-parameters-sent-in-an-http-post-request). –

1

Wenn Sie nicht eine kleine Bibliothek Abhängigkeit nichts dagegen haben, Flurl [Offenlegung: ich bin der Autor] macht diese so kurz und prägnant wie Ihr Python Beispiel, vielleicht um so mehr:

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

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

danke für deine antwort momentan klappt es mir beim nächsten mal werde ich sicher deine bibliothek ausprobieren. – Uwpbeginner