[英]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.