Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone 8.1-JSON(REST post/get/put)请求及其反序列化_C#_Json_Rest_Generics_Windows Phone - Fatal编程技术网

C# Windows Phone 8.1-JSON(REST post/get/put)请求及其反序列化

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> {

我有多个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);
    }
}
公共类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);
返回