C# Windows Phone 8.1-JSON(REST post/get/put)请求及其反序列化
我有多个REST请求,其中我希望获取/发布/放置JSON格式的数据,每个请求有不同的对象 但是,我不想重复我自己的做法,为每个请求编写对服务器的调用和反序列化方法。然而,每个请求或响应包含不同的反序列化对象,如何编写调用和解析它的通用方法C# Windows Phone 8.1-JSON(REST post/get/put)请求及其反序列化,c#,json,rest,generics,windows-phone,C#,Json,Rest,Generics,Windows Phone,我有多个REST请求,其中我希望获取/发布/放置JSON格式的数据,每个请求有不同的对象 但是,我不想重复我自己的做法,为每个请求编写对服务器的调用和反序列化方法。然而,每个请求或响应包含不同的反序列化对象,如何编写调用和解析它的通用方法 (注意这是一个自我回答的问题,我想分享我的帮助请求类,这些类很容易使用)对于不同的类类型使用相同的方法,您必须使用泛型类。这样,您就可以设置自定义反序列化 这是用于发送和接收GET请求的类: public class JsonGet<O> {
(注意这是一个自我回答的问题,我想分享我的帮助请求类,这些类很容易使用)对于不同的类类型使用相同的方法,您必须使用泛型类。这样,您就可以设置自定义反序列化 这是用于发送和接收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);
}
}
公共类JsonGet
{
公共异步任务DoGetRequest(字符串url)
{
var client=新的HttpClient();
CultureInfo ci=新的CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
client.DefaultRequestHeaders.Add(“接受语言”,ci.TwoLetterIsLanguageName);
var uri=新uri(string.Format(
网址,
“行动”,
“得到”,
DateTime.Now.Ticks
));
var response=client.GetAsync(uri);
HttpResponseMessage x=等待响应;
if(x.StatusCode!=System.Net.HttpStatusCode.OK)
{
//抛出新的ConnectionOutException(“发布时:+url+”,我们得到了以下状态代码:+x.StatusCode);
}
HttpContent requestContent=x.内容;
字符串jsonContent=requestContent.ReadAsStringAsync().Result;
反序列化对象(jsonContent);
返回JsonConvert.DeserializeObject(jsonContent);
}
}
然后,您可以通过以下操作轻松获得反序列化对象。请注意,您在泛型零件中键入的类(在本例中为类默认值)是要反序列化的类型:
JsonGet<Defaults> get = new JsonGet<Defaults>();
Defaults myMethod = await get.DoGetRequest(Constants.Constants.UrlDefaults);
JsonGet get=new JsonGet();
默认值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);
}
}
public类JsonSend
{
公共异步任务DoPostRequest(字符串url,I输入)
{
var client=新的HttpClient();
CultureInfo ci=新的CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
client.DefaultRequestHeaders.Add(“接受语言”,ci.TwoLetterIsLanguageName);
var uri=新uri(string.Format(
网址,
“行动”,
“职位”,
DateTime.Now.Ticks
));
string serialized=JsonConvert.serialized对象(输入);
StringContent StringContent=新的StringContent(
连载,,
Encoding.UTF8,
“应用程序/json”);
var response=client.PostAsync(uri,stringContent);
HttpResponseMessage x=等待响应;
if(x.StatusCode!=System.Net.HttpStatusCode.OK)
{
//抛出新的ConnectionOutException(“在输入:“+url+”时,我们得到了以下状态代码:“+x.StatusCode”);
}
HttpContent requestContent=x.内容;
字符串jsonContent=requestContent.ReadAsStringAsync().Result;
返回JsonConvert.DeserializeObject(jsonContent);
}
公共异步任务DoPutRequest(字符串url,I输入)
{
var client=新的HttpClient();
CultureInfo ci=新的CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
client.DefaultRequestHeaders.Add(“接受语言”,ci.TwoLetterIsLanguageName);
var uri=新uri(string.Format(
网址,
“行动”,
“放”,
DateTime.Now.Ticks
));
var response=client.PutAsync(uri,
新内容(
JsonConvert.SerializeObject(输入),
Encoding.UTF8,
“应用程序/json”);
HttpResponseMessage x=等待响应;
if(x.StatusCode!=System.Net.HttpStatusCode.OK)
{
//抛出新的ConnectionOutException(“在输入:“+url+”时,我们得到了以下状态代码:“+x.StatusCode”);
}
HttpContent requestContent=x.内容;
字符串jsonContent=requestContent.ReadAsStringAsync().Result;
返回JsonConvert.DeserializeObject(jsonContent);
}
}
然后您可以按以下方式发送和接收邮件:
JsonSend<User, UserReceived> register = new JsonSend<User, UserReceived>();
UserReceived responseUser = await register.DoPostRequest(Constants.Constants.UrlRegister, user);
JsonSend寄存器=新的JsonSend();
UserReceived responseUser=Wait register.DoPostRequest(Constants.Constants.UrlRegister,用户);
要对不同的类类型使用相同的方法,必须使用泛型类。这样,您就可以设置自定义反序列化
这是用于发送和接收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);
}
}
公共类JsonGet
{
公共异步任务DoGetRequest(字符串url)
{
var client=新的HttpClient();
CultureInfo ci=新的CultureInfo(Windows.System.UserProfile.GlobalizationPreferences.Languages[0]);
client.DefaultRequestHeaders.Add(“接受语言”,ci.TwoLetterIsLanguageName);
var uri=新uri(string.Format(
网址,
“行动”,
“得到”,
DateTime.Now.Ticks
));
var response=client.GetAsync(uri);
HttpResponseMessage x=等待响应;
if(x.StatusCode!=System.Net.HttpStatusCode.OK)
{
//抛出新的ConnectionOutException(“发布时:+url+”,我们得到了以下状态代码:+x.StatusCode);
}
HttpContent requestContent=x.内容;
字符串jsonContent=requestContent.ReadAsStringAsync().Result;
反序列化对象(jsonContent);
返回