【问题标题】:Windows Phone 8.1 - JSON (REST post/get/put) requests and their de/serializationWindows Phone 8.1 - JSON(REST post/get/put)请求及其反序列化
【发布时间】:2015-09-02 09:53:11
【问题描述】:

我有多个 REST 请求,我想以 JSON 格式获取/发布/放置数据,每个请求使用不同的对象。

但是,我不想通过为每个请求编写对服务器的调用和解散方法来重复自己。但是每个请求或响应都包含不同的反序列化对象,如何编写调用和解析它的通用方法?

(请注意,这是一个自我回答的问题,我想分享我的易于使用的帮助请求类)

【问题讨论】:

    标签: c# json rest generics windows-phone


    【解决方案1】:

    要对不同的类类型使用相同的方法,您必须使用通用类。有了它,您可以设置自定义反序列化。

    这是发送和接收 GET 请求的类:

    public class JsonGet<O>
    {
        public async Task<O> DoGetRequest(string url)
        {
            var client = new HttpClient();
            CultureInfo ci = new CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
    
            client.DefaultRequestHeaders.Add("Accept-Language", ci.TwoLetterISOLanguageName);
            var uri = new Uri(string.Format(
                url,
                "action",
                "get",
                DateTime.Now.Ticks
                ));
    
            var response = client.GetAsync(uri);
    
            HttpResponseMessage x = await response;
            if (x.StatusCode != System.Net.HttpStatusCode.OK)
            {
                //throw new ConnectionOutException("While posting: " + url + " we got the following status code: " + x.StatusCode);
            }
            HttpContent requestContent = x.Content;
            string jsonContent = requestContent.ReadAsStringAsync().Result;
            JsonConvert.DeserializeObject<O>(jsonContent);
    
            return JsonConvert.DeserializeObject<O>(jsonContent);
        }
    }
    

    然后您可以通过以下方式轻松获得反序列化的对象。请注意,您在通用部分中键入的类(在本例中是类 Defaults)是要取消实现的类型:

            JsonGet<Defaults> get = new JsonGet<Defaults>();
            Defaults myMethod = await get.DoGetRequest(Constants.Constants.UrlDefaults);
    

    非常相似,您可以为 PUT/POST 请求设置类

    public class JsonSend<I, O>
        {
    
            public async Task<O> DoPostRequest(string url, I input)
            {
                var client = new HttpClient();
                CultureInfo ci = new CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
    
                client.DefaultRequestHeaders.Add("Accept-Language", ci.TwoLetterISOLanguageName);
                var uri = new Uri(string.Format(
                    url,
                    "action",
                    "post",
                    DateTime.Now.Ticks
                    ));
    
                string serialized = JsonConvert.SerializeObject(input);
    
                StringContent stringContent = new StringContent(
                    serialized,
                    Encoding.UTF8,
                    "application/json");
    
                var response = client.PostAsync(uri, stringContent);
    
                HttpResponseMessage x = await response;
                if (x.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    //throw new ConnectionOutException("While puting: " + url + " we got the following status code: " + x.StatusCode);
                }
                HttpContent requestContent = x.Content;
                string jsonContent = requestContent.ReadAsStringAsync().Result;
    
                return JsonConvert.DeserializeObject<O>(jsonContent);
            }
    
            public async Task<O> DoPutRequest(string url, I input)
            {
                var client = new HttpClient();
                CultureInfo ci = new CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
                client.DefaultRequestHeaders.Add("Accept-Language", ci.TwoLetterISOLanguageName);
                var uri = new Uri(string.Format(
                    url,
                    "action",
                    "put",
                    DateTime.Now.Ticks
                    ));
    
                var response = client.PutAsync(uri,
                new StringContent(
                    JsonConvert.SerializeObject(input),
                    Encoding.UTF8,
                    "application/json"));
    
                HttpResponseMessage x = await response;
                if (x.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    //throw new ConnectionOutException("While puting: " + url + " we got the following status code: " + x.StatusCode);
                }
                HttpContent requestContent = x.Content;
                string jsonContent = requestContent.ReadAsStringAsync().Result;
    
                return JsonConvert.DeserializeObject<O>(jsonContent);
            }
        }
    

    然后您可以发送和接收 POST 如下:

            JsonSend<User, UserReceived> register = new JsonSend<User, UserReceived>();
            UserReceived responseUser = await register.DoPostRequest(Constants.Constants.UrlRegister, user);
    

    【讨论】:

      【解决方案2】:

      你可以试试这个通用的方法

        public static async Task<T> ExecuteGet<T, K>(string url, K obj) where T : class
          {
              if (String.IsNullOrWhiteSpace(url))
                  return default(T);
              var client = new HttpClient();
              string str = JsonConvert.SerializeObject(obj);
              Debug.WriteLine("json Request :" + url + str);
      
              HttpResponseMessage response = await client.GetAsync(new Uri(url + str));
      
              if (response.IsSuccessStatusCode)
              {
                  var ResponceString = await response.Content.ReadAsStringAsync();
                  Debug.WriteLine("Json responce :" + ResponceString);
                  var data = JsonConvert.DeserializeObject<T>(ResponceString);
      
                  return (T)Convert.ChangeType(data, typeof(T));
      
              }
              else
              {
                  return default(T);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多