2012-06-18 11 views
7

Ich habe eine Webanwendung, die JQuery verwendet, um mit meinem Backend zu interagieren. Das Back-End akzeptiert JSON-Daten erfolgreich. Zum Beispiel kann ich folgende JSON erfolgreich senden:JSON über WebClient hochladen

Ich habe jetzt eine Windows Phone App, die dieses Backend treffen muss. Ich muss dieses JSON über einen WebClient übergeben. Momentan habe ich folgendes, aber ich bin mir nicht sicher, wie ich das JSON tatsächlich weitergeben soll.

Kann mir jemand sagen, was ich tun soll?

+0

Der Standard für kleine JSON-Daten, die Ihre Datenserver-Seite nicht ändern, besteht darin, sie einfach als Parameter der URL hinzuzufügen, die Sie in GET aufrufen. In anderen Fällen können Sie sie im Hauptteil Ihrer Anfrage in POST senden. –

+0

Was meinen Sie mit "senden sie in POST in den Körper Ihrer Anfrage"? Wie machst du das mit einem WebClient? –

Antwort

11

Ich habe es herausgefunden. Ich war zu vergessen, die folgenden:

myService.Headers.Add("Content-Type", "application/json"); 
+0

Lassen Sie mich diese Zeile hinzufügen, es ist auch entscheidend speziell für Nachrichten mit nicht-Englisch-Sprachen 'client.Encoding = System.Text.Encoding.UTF8; ' Das ist, was in meinem Fall fehlte. – JohnPan

14

Obwohl die Frage bereits beantwortet ist, dachte ich, es wäre schön, meine einfache JsonService zu teilen, basierend auf dem WebClient:

Basisklasse

/// <summary> 
/// Class BaseJsonService. 
/// </summary> 
public abstract class BaseJsonService 
{ 
    /// <summary> 
    /// The client 
    /// </summary> 
    protected WebClient client; 

    /// <summary> 
    /// Gets the specified URL. 
    /// </summary> 
    /// <typeparam name="TResponse">The type of the attribute response.</typeparam> 
    /// <param name="url">The URL.</param> 
    /// <param name="onComplete">The configuration complete.</param> 
    /// <param name="onError">The configuration error.</param> 
    public abstract void Get<TResponse>(string url, Action<TResponse> onComplete, Action<Exception> onError); 
    /// <summary> 
    /// Sends the specified URL. 
    /// </summary> 
    /// <typeparam name="TResponse">The type of the attribute response.</typeparam> 
    /// <param name="url">The URL.</param> 
    /// <param name="jsonData">The json data.</param> 
    /// <param name="onComplete">The configuration complete.</param> 
    /// <param name="onError">The configuration error.</param> 
    public abstract void Post<TResponse>(string url, string jsonData, Action<TResponse> onComplete, Action<Exception> onError); 
} 

Serviceimplementierung

/// <summary> 
    /// Class JsonService. 
    /// </summary> 
    public class JsonService : BaseJsonService 
    { 
     /// <summary> 
     /// Gets the specified URL. 
     /// </summary> 
     /// <typeparam name="TResponse">The type of the attribute response.</typeparam> 
     /// <param name="url">The URL.</param> 
     /// <param name="onComplete">The configuration complete.</param> 
     /// <param name="onError">The configuration error.</param> 
     public override void Get<TResponse>(string url, Action<TResponse> onComplete, Action<Exception> onError) 
     { 
      if (client == null) 
       client = new WebClient(); 

      client.DownloadStringCompleted += (s, e) => 
      { 
       TResponse returnValue = default(TResponse); 

       try 
       { 
        returnValue = JsonConvert.DeserializeObject<TResponse>(e.Result); 
        onComplete(returnValue); 
       } 
       catch (Exception ex) 
       { 
        onError(new JsonParseException(ex)); 
       } 
      }; 

      client.Headers.Add(HttpRequestHeader.Accept, "application/json"); 
      client.Encoding = System.Text.Encoding.UTF8; 

      client.DownloadStringAsync(new Uri(url)); 
     } 
     /// <summary> 
     /// Posts the specified URL. 
     /// </summary> 
     /// <typeparam name="TResponse">The type of the attribute response.</typeparam> 
     /// <param name="url">The URL.</param> 
     /// <param name="jsonData">The json data.</param> 
     /// <param name="onComplete">The configuration complete.</param> 
     /// <param name="onError">The configuration error.</param> 
     public override void Post<TResponse>(string url, string jsonData, Action<TResponse> onComplete, Action<Exception> onError) 
     { 
      if (client == null) 
       client = new WebClient(); 

      client.UploadDataCompleted += (s, e) => 
      { 
       if (e.Error == null && e.Result != null) 
       { 
        TResponse returnValue = default(TResponse); 

        try 
        { 
         string response = Encoding.UTF8.GetString(e.Result); 
         returnValue = JsonConvert.DeserializeObject<TResponse>(response); 
        } 
        catch (Exception ex) 
        { 
         onError(new JsonParseException(ex)); 
        } 

        onComplete(returnValue); 
       } 
       else 
        onError(e.Error); 
      }; 

      client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); 
      client.Encoding = System.Text.Encoding.UTF8; 

      byte[] data = Encoding.UTF8.GetBytes(jsonData); 
      client.UploadDataAsync(new Uri(url), "POST", data); 
     } 
    } 

Anwendungsbeispiel

/// <summary> 
    /// Determines whether this instance [can get result from service]. 
    /// </summary> 
    [Test] 
    public void CanGetResultFromService() 
    { 
     string url = "http://httpbin.org/ip"; 
     Ip result; 

     service.Get<Ip>(url, 
     success => 
     { 
      result = success; 
     }, 
     error => 
     { 
      Debug.WriteLine(error.Message); 
     }); 

     Thread.Sleep(5000); 
    } 
    /// <summary> 
    /// Determines whether this instance [can post result automatic service]. 
    /// </summary> 
    [Test] 
    public void CanPostResultToService() 
    { 
     string url = "http://httpbin.org/post"; 
     string data = "{\"test\":\"hoi\"}"; 
     HttpBinResponse result = null; 

     service.Post<HttpBinResponse>(url, data, 
      response => 
      { 
       result = response; 
      }, 
      error => 
      { 
       Debug.WriteLine(error.Message); 
      }); 

     Thread.Sleep(5000); 
    } 
} 
public class Ip 
{ 
    public string Origin { get; set; } 
} 
public class HttpBinResponse 
{ 
    public string Url { get; set; } 
    public string Origin { get; set; } 
    public Headers Headers { get; set; } 
    public object Json { get; set; } 
    public string Data { get; set; } 
} 
public class Headers 
{ 
    public string Connection { get; set; } 
    [JsonProperty("Content-Type")] 
    public string ContentType { get; set; } 
    public string Host { get; set; } 
    [JsonProperty("Content-Length")] 
    public string ContentLength { get; set; } 
} 

einfach etwas Wissen zu teilen!

Viel Glück!