2012-06-18 62 views
7

私はバックエンドと対話するためにJQueryを使用しているWebアプリケーションを持っています。バックエンドはJSONデータを正常に受け入れます。たとえば、次のJSONを正常に送信できます。WebClient経由でJSONをアップロード

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

私は今このバックエンドに当たっていなければならないWindows Phoneアプリを持っています。 WebClient経由で同じJSONを渡す必要があります。現在、私は以下を持っていますが、実際にJSONを渡す方法はわかりません。

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

誰かが私に何をする必要があるか教えてもらえますか?

+0

データサーバー側を変更しない小さなJSONデータの標準的な方法は、GETで呼び出すURLのパラメータとして単純に追加することです。それ以外の場合は、リクエストの本文にPOSTで送信することができます。 –

+0

「あなたの要求の本文にPOSTで送信してください」とはどういう意味ですか?あなたはWebClientを使ってそれをどのようにしていますか? –

答えて

11

私は次のことを忘れた。

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

この行を追加してください。英語以外の言語のメッセージには特に重要です。 'client.Encoding = System.Text.Encoding.UTF8; ' これは私の場合に欠けていたものです。 – JohnPan

14

質問が既に回答されているが、私は、Webクライアントに基づいて、私の簡単なJsonServiceを共有するためにいいだろうと思った:

基本クラス

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

サービスの実装

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

使用例

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

ただ、いくつかの知識を共有します!

幸運を祈る!

関連する問題