2012-06-18 19 views
7

Mam aplikację internetową, która używa JQuery do interakcji z moim zapleczem. Backend pomyślnie akceptuje dane JSON. Na przykład mogę wysłać następujące JSON:Prześlij JSON przez WebClient

{ "id":1, "firstName":"John", "lastName":"Smith" } 

Mam teraz aplikację Windows Phone, która musi trafić w ten backend. Muszę przekazać ten sam JSON przez WebClient. Obecnie mam następujące, ale nie jestem pewien, jak faktycznie przekazać JSON.

string address = "http://www.mydomain.com/myEndpoint; 
WebClient myService = new WebClient(); 
utilityService.UploadStringCompleted += new UploadStringCompletedEventHandler(utilityService_UploadStringCompleted); 
utilityService.UploadStringAsync(address, string.Empty); 

Czy ktoś może mi powiedzieć, co muszę zrobić?

+0

Standardowy sposób na małe dane JSON, które nie zmieniają strony serwera danych, to po prostu dodać je jako parametr adresu URL, który wywołujesz w GET. W innych przypadkach możesz wysłać je w POST w treści swojej prośby. –

+0

Co masz na myśli mówiąc "wyślij je w POST w treści swojej prośby"? Jak to zrobić z WebClient? –

Odpowiedz

11

Wyliczyłem to. Ja zapominam co następuje:

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

Pozwolę sobie dodać tę linię, jest to również kluczowe szczególnie dla wiadomości z językami nieangielskimi 'client.Encoding = System.Text.Encoding.UTF8; ' Tego właśnie brakowało w moim przypadku. – JohnPan

14

Choć pytanie jest już odpowiedź, pomyślałem, że byłoby miło, aby podzielić się moją prostą JsonService, w oparciu o WebClient:

Klasa bazowa

/// <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); 
} 

Implementacja usługi

/// <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); 
     } 
    } 

Przykład użycia

/// <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; } 
} 

Wystarczy podzielić się wiedzą!

Powodzenia!