2012-06-18 37 views
7

Tôi có một ứng dụng web với ứng dụng đó đang sử dụng JQuery để tương tác với chương trình phụ trợ của tôi. Phần cuối phụ trợ thành công dữ liệu JSON. Ví dụ: tôi có thể gửi thành công JSON sau đây:Tải lên JSON qua WebClient

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

Tôi hiện có ứng dụng Windows Phone phải nhấn phụ trợ này. Tôi cần phải chuyển JSON này qua WebClient. Hiện tại tôi có những điều sau đây, nhưng tôi không chắc chắn làm thế nào để thực sự vượt qua JSON.

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

Ai đó có thể cho tôi biết tôi cần làm gì không?

+0

Cách tiêu chuẩn cho dữ liệu JSON nhỏ không thay đổi phía máy chủ dữ liệu của bạn là chỉ cần thêm chúng làm tham số của URL bạn gọi trong GET. Trong các trường hợp khác, bạn có thể gửi chúng trong POST trong phần yêu cầu của bạn. –

+0

Bạn có ý gì bằng cách "gửi chúng trong POST trong phần nội dung yêu cầu của bạn"? Làm thế nào để bạn làm điều đó với một WebClient? –

Trả lời

11

Đã tìm ra. Tôi đã quên những điều sau đây:

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

Hãy để tôi thêm dòng này, nó cũng rất quan trọng đối với các thư không có ngôn ngữ không phải tiếng Anh 'client.Encoding = System.Text.Encoding.UTF8; ' Đây là những gì còn thiếu trong trường hợp của tôi. – JohnPan

14

Mặc dù câu hỏi đã được trả lời, tôi nghĩ rằng nó sẽ được tốt đẹp để chia sẻ JsonService đơn giản của tôi, dựa trên WebClient:

class Base

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

Triển khai dịch vụ

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

sử dụng Ví dụ

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

Chỉ cần chia sẻ một số kiến ​​thức!

Chúc may mắn!

Các vấn đề liên quan