[英]Windows Phone 8.1 - JSON (REST post/get/put) requests and their de/serialization
我有多个REST请求,我想在其中以每个请求的不同对象获取JSON格式的数据/发布/放置数据。
但是,我不想通过为每个请求编写对服务器的调用和非实现方法来重复自己。 但是每个请求或响应都包含要反序列化的不同对象,如何编写用于调用和解析的通用方法?
(请注意,这是一个自我回答的问题,我想分享易于使用的帮助请求类)
若要对不同的类类型使用相同的方法,则必须使用泛型类。 这样,您可以设置自定义反序列化。
这是用于发送和接收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);
你可以试试这个通用的方法
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.