2016-04-14 15 views
3

Ich möchte das in der Funktion empfangene Objekt konvertieren und tun, um es in ein Objekt ({"some_key": "some_value"}) zu konvertieren.HTTP-Anfrage mit C#

Hier ist mein Code:

public HttpRequests(string url, string method, Object data) 
{ 

    //The following prepares data, according to received parameter 

    if (data is Array) 
    { 
     data = (Array)data; 
    } 
    else if (data is Dictionary<Object, Object>) 
    { 
     data = ((Dictionary<string, string>)data)["something"] = platform_secret; 
     data = ((Dictionary<string, string>)data)["something2"] = "1"; 
    } 

    method = method.ToUpper(); //POST or GET 

    this.url = just_url + url; 
    this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data); 
    this.method = method; 

} 

public Object performRequest() 
{ 

    if (this.data != null && url != null) 
    { 

     WebRequest request = HttpWebRequest.Create(url); 

     byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]); 
     //^ this does not work. Am I supposed to do this? 
     // as I said, what I want is to get an object {key: something} that can be read 
     //  by $_POST["key"] in the server 

     request.Method = method; 
     request.ContentType = "application/x-www-form-urlencoded"; //TODO: check 
     //request.ContentLength = ((Dictionary<string, string>) data); 
     request.ContentLength = data_bytes.Length; 

     Stream dataStream = request.GetRequestStream(); //TODO: not async at the moment 

     //{BEGIN DOUBT 

     dataStream.Write(data_bytes, 0, data_bytes.Length); 
     dataStream.Close(); 

     //DOUBT: DO THIS^or THIS:_  ??? 

     StreamWriter writer = new StreamWriter(dataStream); 
     writer.Write(this.data); 

     //End DOUBT} 

     WebResponse response = request.GetResponse(); 
     Stream dataResponse = response.GetResponseStream(); 

     writer.Close(); 
     response.Close(); 
     dataStream.Close(); 

     return dataResponse. 

    } 

Was genau bin ich hier fehlt?

+0

Hast du versucht zu debuggen, was in 'this.data' steckt? Auch verwenden Sie 'Daten' anstelle von' this.data' – Clijsters

+0

Ihr Code ist falsch oder unvollständig. Die obere Funktion hat keinen Rückgabetyp oder Funktionsnamen, und die Variablen platform_secret und just_url sind nicht definiert. Kannst du Arbeitscode liefern? – martijn

+0

Bitte fügen Sie eine klare Erklärung Ihres Problems oder Ihrer Frage hinzu. "Was ich vermisse" ist keine echte Frage. – cassandrad

Antwort

0

Sie müssen das erste Stück Code verwenden. Here is and exmaple. Aber das zweite Stück könnte auch funktionieren, denke ich. Sie haben auf C# -Seite nichts verpasst. Ein Problem könnte jedoch in den Daten auftreten, die Sie übertragen werden. Wenn es zum Beispiel nicht korrekt codiert ist.

2

Wie Sie ursprünglich this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data); zuweisen, nehmen Sie an, dass his.data den Typ string hat (Sie können ändern, wenn es anders ist).

Dann statt byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]); müssen Sie dies nur byte[] data_bytes = Encoding.ASCII.GetBytes(data);

Nach dem Gebrauch schreiben

//{BEGIN DOUBT 

     dataStream.Write(data_bytes, 0, data_bytes.Length); 
     dataStream.Close(); 

Es wird helfen, das Gespräch mit einigen Daten zu tun, aber es hilft nicht, Ihr Problem zu lösen. request.ContentType = "application/x-www-form-urlencoded"; erwartet nicht, dass die Daten Newtonsoft.Json.JsonConvert.SerializeObject serialisiert sind. Es erwartet eine Zeichenfolge, die & getrennte Paare enthält, die urlencoded sind.

name1=value1&name2=value2&name3=value3 

Sie müssen also dieses Format anstelle von JSON verwenden.

0

Sie etwas näher an die Linien von diesem sollten ...

tun
void Main() 
{ 

    var formSerializer = new FormEncodedSerializer(); 
    formSerializer.Add("key", "value"); 
    formSerializer.Add("foo", "rnd"); 
    formSerializer.Add("bar", "random"); 

    var uri = @"http://example.com"; 
    var contentType = @"application/x-www-form-urlencoded"; 
    var postData = formSerializer.Serialize(); 
    var http = new Http(); 

    Console.WriteLine (http.Post(uri, postData, contentType)); 
} 


public class Http 
{ 
    public string Post(string url, string data, string format) 
    { 
     var content = Encoding.UTF8.GetBytes(data); 
     var contentLength = content.Length; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.ServicePoint.Expect100Continue = false; 
     request.Method = "POST"; 
     request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     request.ContentType = format; 
     request.ContentLength = contentLength; 

     using (Stream requestStream = request.GetRequestStream()) 
     { 
      requestStream.Write(content, 0, content.Length); 
     } 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     using (Stream responseStream = response.GetResponseStream()) 
     using (StreamReader reader = new StreamReader(responseStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
}` 


public class FormEncodedSerializer 
{ 
    private Dictionary<string, string> formKeysPairs; 

    public FormEncodedSerializer(): this(new Dictionary<string, string>()) 
    { 
    } 

    public FormEncodedSerializer(Dictionary<string, string> kvp) 
    { 
     this.formKeysPairs = kvp; 
    } 

    public void Add(string key, string value) 
    { 
     formKeysPairs.Add(key, value); 
    } 

    public string Serialize() 
    { 
     return string.Join("", this.formKeysPairs.Select(f => string.Format("&{0}={1}", f.Key,f.Value))).Substring(1); 
    } 

    public void Clear() 
    { 
     this.formKeysPairs.Clear(); 
    } 
} 
0

ich nicht wirklich verstehen, was Sie da erwartet, in welchem ​​Format die Daten zu senden. Wie auch immer, wenn Sie ContentType wie "application/x-www-form-urlencoded" setzen, müssen Sie Ihre Daten in diesem Format codieren. Sie können es einfach mit diesem Code tun;

var values = ((Dictionary<string, string>)data).Aggregate(
        new NameValueCollection(), 
        (seed, current) => 
        { 
         seed.Add(current.Key, current.Value); 
         return seed; 
        }); 

So werden Ihre Daten wie "etwas = platform_secret & something2 = 1" gesendet

Jetzt können Sie Formulardaten senden einfach:

WebClient client = new WebClient(); 
var result = client.UploadValues(url, values); 
0

Ich denke, Ihre erste Funktion mit Unterschrift public HttpRequests(string url, string method, Object data) scheint keinen logischen Fehler zu haben, aber in Ihrer zweiten Funktion mit Signatur public Object performRequest() haben Sie ein Problem:

  • Wenn Ihre HTTP-Methode GET ist, müssen Sie keinen Content-Stream schreiben.
  • wenn Ihre Methode ist POST und Ihre Daten sind JSON Sie HTTP Anforderer wie diese brauchen Einrichtung:

    request.ContentType = "application/json"; 
    

und schließlich Stream leeren, bevor Sie es schließen, wie diese request.Flush();