Windows Phone 8.1 - JSON (REST post/get/put) 请求及其 de/serialization
Windows Phone 8.1 - JSON (REST post/get/put) requests and their de/serialization
我有多个 REST 请求,我想 get/post/put 数据 JSON 格式,每个请求都有不同的对象。
但是我不想通过为每个请求编写对服务器的调用和反序列化方法来重复自己。但是每个request或者response都包含不同的object到de/serialize,如何编写调用和解析它的通用方法?
(请注意这是自答问题,我想分享我的帮助请求 类,它很容易使用)
要对不同的 class 类型使用相同的方法,您必须使用通用 class。这样,您可以设置自定义 de/serialization.
这是 class 用于发送和接收 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);
}
}
接下来就可以轻松获取反序列化对象了。请注意,您在通用部分中键入的 class(在本例中为 class 默认值)是要反序列化的类型:
JsonGet<Defaults> get = new JsonGet<Defaults>();
Defaults myMethod = await get.DoGetRequest(Constants.Constants.UrlDefaults);
非常相似,您可以为 PUT/POST 个请求设置 class
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);
}
}
我有多个 REST 请求,我想 get/post/put 数据 JSON 格式,每个请求都有不同的对象。
但是我不想通过为每个请求编写对服务器的调用和反序列化方法来重复自己。但是每个request或者response都包含不同的object到de/serialize,如何编写调用和解析它的通用方法?
(请注意这是自答问题,我想分享我的帮助请求 类,它很容易使用)
要对不同的 class 类型使用相同的方法,您必须使用通用 class。这样,您可以设置自定义 de/serialization.
这是 class 用于发送和接收 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);
}
}
接下来就可以轻松获取反序列化对象了。请注意,您在通用部分中键入的 class(在本例中为 class 默认值)是要反序列化的类型:
JsonGet<Defaults> get = new JsonGet<Defaults>();
Defaults myMethod = await get.DoGetRequest(Constants.Constants.UrlDefaults);
非常相似,您可以为 PUT/POST 个请求设置 class
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);
}
}